(function(l, fa) {
  "object" === typeof exports && "undefined" !== typeof module ? fa(exports) : "function" === typeof define && define.amd ? define(["exports"], fa) : (l = l || self, fa(l.THREE = {}))
})(this, function(l) {

  function atob(input) {
    var keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
    var output = ''
    var chr1, chr2, chr3
    var enc1, enc2, enc3, enc4
    var i = 0
    input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '')
    do {
        enc1 = keyStr.indexOf(input.charAt(i++))
        enc2 = keyStr.indexOf(input.charAt(i++))
        enc3 = keyStr.indexOf(input.charAt(i++))
        enc4 = keyStr.indexOf(input.charAt(i++))
        chr1 = (enc1 << 2) | (enc2 >> 4)
        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2)
        chr3 = ((enc3 & 3) << 6) | enc4
        output = output + String.fromCharCode(chr1)
        if (enc3 !== 64) {
            output = output + String.fromCharCode(chr2)
        }
        if (enc4 !== 64) {
            output = output + String.fromCharCode(chr3)
        }
    } while (i < input.length)
    return output
}
  function fa() {}

  function fb(e, h) {
    if (!(e instanceof h)) throw new TypeError("Cannot call a class as a function");
  }

  function Oh(e, h) {
    for (var a = 0; a < h.length; a++) {
      var b = h[a];
      b.enumerable = b.enumerable || !1;
      b.configurable = !0;
      "value" in b && (b.writable = !0);
      Object.defineProperty(e, b.key, b)
    }
  }

  function Ve(e, h, a) {
    h && Oh(e.prototype,
      h);
    a && Oh(e, a);
    return e
  }

  function Wb(e, h) {
    if ("function" !== typeof h && null !== h) throw new TypeError("Super expression must either be null or a function");
    e.prototype = Object.create(h && h.prototype, {
      constructor: {
        value: e,
        writable: !0,
        configurable: !0
      }
    });
    h && mg(e, h)
  }

  function sb(e) {
    sb = Object.setPrototypeOf ? Object.getPrototypeOf : function(e) {
      return e.__proto__ || Object.getPrototypeOf(e)
    };
    return sb(e)
  }

  function mg(e, h) {
    mg = Object.setPrototypeOf || function(a, b) {
      a.__proto__ = b;
      return a
    };
    return mg(e, h)
  }

  function tb(e) {
    if (void 0 ===
      e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
    return e
  }

  function Xb(e, h) {
    return !h || "object" !== typeof h && "function" !== typeof h ? tb(e) : h
  }

  function ng(e) {
    if (Array.isArray(e)) {
      var h = 0;
      for (var a = Array(e.length); h < e.length; h++) a[h] = e[h];
      h = a
    } else h = void 0;
    h || (h = Symbol.iterator in Object(e) || "[object Arguments]" === Object.prototype.toString.call(e) ? Array.from(e) : void 0);
    if (!(e = h)) throw new TypeError("Invalid attempt to spread non-iterable instance");
    return e
  }

  function Ph(e,
    h) {
    "parentNode" in e || Object.defineProperty(e, "parentNode", {
      enumerable: !0,
      get: 0 === h ? function() {
        return null
      } : 1 === h ? function() {
        return V.documentElement
      } : function() {
        return V.body
      }
    });
    "parentElement" in e || Object.defineProperty(e, "parentElement", {
      enumerable: !0,
      get: 0 === h ? function() {
        return null
      } : 1 === h ? function() {
        return V.documentElement
      } : function() {
        return V.body
      }
    })
  }

  function Nj(e) {
    "clientLeft" in e || (e.clientLeft = 0, e.clientTop = 0);
    "clientWidth" in e || (e.clientWidth = Kc, e.clientHeight = Lc);
    "getBoundingClientRect" in
    e || (e.getBoundingClientRect = function() {
      var e = {
        x: 0,
        y: 0,
        top: 0,
        left: 0,
        width: this.clientWidth,
        height: this.clientHeight
      };
      e.right = e.width;
      e.bottom = e.height;
      return e
    })
  }

  function Qh(e) {
    var h = function() {};
    e.classList = [];
    e.classList.add = h;
    e.classList.remove = h;
    e.classList.contains = h;
    e.classList.toggle = h
  }

  function og(e, h) {
    var a = !0,
      b = !1,
      c = void 0;
    try {
      for (var d = Object.getOwnPropertyNames(h)[Symbol.iterator](), f; !(a = (f = d.next()).done); a = !0) {
        var g = f.value;
        if ("constructor" !== g && "prototype" !== g && "name" !== g) {
          var k = Object.getOwnPropertyDescriptor(h,
            g);
          Object.defineProperty(e, g, k)
        }
      }
    } catch (m) {
      b = !0, c = m
    } finally {
      try {
        if (!a && null != d["return"]) d["return"]()
      } finally {
        if (b) throw c;
      }
    }
  }

  function Rh() {
    var e = ra;
    if (!e) throw Error("please register a canvas");
    e = e.createImage();
    "tagName" in e || (e.tagName = "IMG");
    Ph(e);
    Qh(e);
    return e
  }

  function Sh(e) {
    return function() {
      V.visibilityState = e ? "visible" : "hidden";
      var h = !e;
      V.hidden !== h && (V.hidden = h, h = new pg("visibilitychange"), h.target = V, h.timeStamp = Date.now(), V.dispatchEvent(h))
    }
  }

  function Yb(e) {
    var h = 1 < arguments.length && void 0 !==
      arguments[1] ? arguments[1] : {};
    h.target = h.target || this;
    "function" === typeof this["on".concat(e)] && this["on".concat(e)].call(this, h)
  }

  function We(e) {
    var h = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {};
    this.readyState = e;
    h.readyState = e;
    Yb.call(this, "readystatechange", h)
  }

  function Th(e, h) {
    V.addEventListener(e, h)
  }

  function Uh(e, h) {
    V.removeEventListener(e, h)
  }

  function Ra() {}

  function z(e, h) {
    this.x = e || 0;
    this.y = h || 0
  }

  function ya(e, h, a, b) {
    this._x = e || 0;
    this._y = h || 0;
    this._z = a || 0;
    this._w = void 0 !== b ? b : 1
  }

  function q(e,
    h, a) {
    this.x = e || 0;
    this.y = h || 0;
    this.z = a || 0
  }

  function ka() {
    this.elements = [1, 0, 0, 0, 1, 0, 0, 0, 1];
    0 < arguments.length && console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")
  }

  function S(e, h, a, b, c, d, f, g, k, m) {
    Object.defineProperty(this, "id", {
      value: Oj++
    });
    this.uuid = N.generateUUID();
    this.name = "";
    this.image = void 0 !== e ? e : S.DEFAULT_IMAGE;
    this.mipmaps = [];
    this.mapping = void 0 !== h ? h : S.DEFAULT_MAPPING;
    this.wrapS = void 0 !== a ? a : 1001;
    this.wrapT = void 0 !== b ? b : 1001;
    this.magFilter = void 0 !==
      c ? c : 1006;
    this.minFilter = void 0 !== d ? d : 1008;
    this.anisotropy = void 0 !== k ? k : 1;
    this.format = void 0 !== f ? f : 1023;
    this.type = void 0 !== g ? g : 1009;
    this.offset = new z(0, 0);
    this.repeat = new z(1, 1);
    this.center = new z(0, 0);
    this.rotation = 0;
    this.matrixAutoUpdate = !0;
    this.matrix = new ka;
    this.generateMipmaps = !0;
    this.premultiplyAlpha = !1;
    this.flipY = !0;
    this.unpackAlignment = 4;
    this.encoding = void 0 !== m ? m : 3E3;
    this.version = 0;
    this.onUpdate = null
  }

  function ca(e, h, a, b) {
    this.x = e || 0;
    this.y = h || 0;
    this.z = a || 0;
    this.w = void 0 !== b ? b : 1
  }

  function sa(e,
    h, a) {
    this.width = e;
    this.height = h;
    this.scissor = new ca(0, 0, e, h);
    this.scissorTest = !1;
    this.viewport = new ca(0, 0, e, h);
    a = a || {};
    this.texture = new S(void 0, void 0, a.wrapS, a.wrapT, a.magFilter, a.minFilter, a.format, a.type, a.anisotropy, a.encoding);
    this.texture.image = {};
    this.texture.image.width = e;
    this.texture.image.height = h;
    this.texture.generateMipmaps = void 0 !== a.generateMipmaps ? a.generateMipmaps : !1;
    this.texture.minFilter = void 0 !== a.minFilter ? a.minFilter : 1006;
    this.depthBuffer = void 0 !== a.depthBuffer ? a.depthBuffer :
      !0;
    this.stencilBuffer = void 0 !== a.stencilBuffer ? a.stencilBuffer : !0;
    this.depthTexture = void 0 !== a.depthTexture ? a.depthTexture : null
  }

  function qg(e, h, a) {
    sa.call(this, e, h, a);
    this.samples = 4
  }

  function I() {
    this.elements = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
    0 < arguments.length && console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")
  }

  function Zb(e, h, a, b) {
    this._x = e || 0;
    this._y = h || 0;
    this._z = a || 0;
    this._order = b || Zb.DefaultOrder
  }

  function rg() {
    this.mask = 1
  }

  function E() {
    Object.defineProperty(this,
      "id", {
        value: Pj++
      });
    this.uuid = N.generateUUID();
    this.name = "";
    this.type = "Object3D";
    this.parent = null;
    this.children = [];
    this.up = E.DefaultUp.clone();
    var e = new q,
      h = new Zb,
      a = new ya,
      b = new q(1, 1, 1);
    h._onChange(function() {
      a.setFromEuler(h, !1)
    });
    a._onChange(function() {
      h.setFromQuaternion(a, void 0, !1)
    });
    Object.defineProperties(this, {
      position: {
        configurable: !0,
        enumerable: !0,
        value: e
      },
      rotation: {
        configurable: !0,
        enumerable: !0,
        value: h
      },
      quaternion: {
        configurable: !0,
        enumerable: !0,
        value: a
      },
      scale: {
        configurable: !0,
        enumerable: !0,
        value: b
      },
      modelViewMatrix: {
        value: new I
      },
      normalMatrix: {
        value: new ka
      }
    });
    this.matrix = new I;
    this.matrixWorld = new I;
    this.matrixAutoUpdate = E.DefaultMatrixAutoUpdate;
    this.matrixWorldNeedsUpdate = !1;
    this.layers = new rg;
    this.visible = !0;
    this.receiveShadow = this.castShadow = !1;
    this.frustumCulled = !0;
    this.renderOrder = 0;
    this.userData = {}
  }

  function Kd() {
    E.call(this);
    this.type = "Scene";
    this.overrideMaterial = this.fog = this.background = null;
    this.autoUpdate = !0;
    "undefined" !== typeof __THREE_DEVTOOLS__ && __THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe", {
      detail: this
    }))
  }

  function gb(e, h) {
    this.min = void 0 !== e ? e : new q(Infinity, Infinity, Infinity);
    this.max = void 0 !== h ? h : new q(-Infinity, -Infinity, -Infinity)
  }

  function sg(e, h, a, b, c) {
    var d;
    var f = 0;
    for (d = e.length - 3; f <= d; f += 3) {
      $b.fromArray(e, f);
      var g = c.x * Math.abs($b.x) + c.y * Math.abs($b.y) + c.z * Math.abs($b.z),
        k = h.dot($b),
        m = a.dot($b),
        n = b.dot($b);
      if (Math.max(-Math.max(k, m, n), Math.min(k, m, n)) > g) return !1
    }
    return !0
  }

  function ub(e, h) {
    this.center = void 0 !== e ? e : new q;
    this.radius = void 0 !== h ? h : 0
  }

  function ac(e, h) {
    this.origin = void 0 !==
      e ? e : new q;
    this.direction = void 0 !== h ? h : new q
  }

  function Sa(e, h) {
    this.normal = void 0 !== e ? e : new q(1, 0, 0);
    this.constant = void 0 !== h ? h : 0
  }

  function va(e, h, a) {
    this.a = void 0 !== e ? e : new q;
    this.b = void 0 !== h ? h : new q;
    this.c = void 0 !== a ? a : new q
  }

  function D(e, h, a) {
    return void 0 === h && void 0 === a ? this.set(e) : this.setRGB(e, h, a)
  }

  function tg(e, h, a) {
    0 > a && (a += 1);
    1 < a && --a;
    return a < 1 / 6 ? e + 6 * (h - e) * a : .5 > a ? h : a < 2 / 3 ? e + 6 * (h - e) * (2 / 3 - a) : e
  }

  function ug(e) {
    return .04045 > e ? .0773993808 * e : Math.pow(.9478672986 * e + .0521327014, 2.4)
  }

  function vg(e) {
    return .0031308 >
      e ? 12.92 * e : 1.055 * Math.pow(e, .41666) - .055
  }

  function Mc(e, h, a, b, c, d) {
    this.a = e;
    this.b = h;
    this.c = a;
    this.normal = b && b.isVector3 ? b : new q;
    this.vertexNormals = Array.isArray(b) ? b : [];
    this.color = c && c.isColor ? c : new D;
    this.vertexColors = Array.isArray(c) ? c : [];
    this.materialIndex = void 0 !== d ? d : 0
  }

  function R() {
    Object.defineProperty(this, "id", {
      value: Qj++
    });
    this.uuid = N.generateUUID();
    this.name = "";
    this.type = "Material";
    this.fog = !0;
    this.blending = 1;
    this.side = 0;
    this.vertexTangents = this.flatShading = !1;
    this.vertexColors = 0;
    this.opacity =
      1;
    this.transparent = !1;
    this.blendSrc = 204;
    this.blendDst = 205;
    this.blendEquation = 100;
    this.blendEquationAlpha = this.blendDstAlpha = this.blendSrcAlpha = null;
    this.depthFunc = 3;
    this.depthWrite = this.depthTest = !0;
    this.stencilWriteMask = 255;
    this.stencilFunc = 519;
    this.stencilRef = 0;
    this.stencilFuncMask = 255;
    this.stencilZPass = this.stencilZFail = this.stencilFail = 7680;
    this.stencilWrite = !1;
    this.clippingPlanes = null;
    this.clipShadows = this.clipIntersection = !1;
    this.shadowSide = null;
    this.colorWrite = !0;
    this.precision = null;
    this.polygonOffset = !1;
    this.polygonOffsetUnits = this.polygonOffsetFactor = 0;
    this.dithering = !1;
    this.alphaTest = 0;
    this.premultipliedAlpha = !1;
    this.toneMapped = this.visible = !0;
    this.userData = {};
    this.needsUpdate = !0
  }

  function Ia(e) {
    R.call(this);
    this.type = "MeshBasicMaterial";
    this.color = new D(16777215);
    this.lightMap = this.map = null;
    this.lightMapIntensity = 1;
    this.aoMap = null;
    this.aoMapIntensity = 1;
    this.envMap = this.alphaMap = this.specularMap = null;
    this.combine = 0;
    this.reflectivity = 1;
    this.refractionRatio = .98;
    this.wireframe = !1;
    this.wireframeLinewidth =
      1;
    this.wireframeLinejoin = this.wireframeLinecap = "round";
    this.morphTargets = this.skinning = !1;
    this.setValues(e)
  }

  function O(e, h, a) {
    if (Array.isArray(e)) throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");
    this.name = "";
    this.array = e;
    this.itemSize = h;
    this.count = void 0 !== e ? e.length / h : 0;
    this.normalized = !0 === a;
    this.usage = 35044;
    this.updateRange = {
      offset: 0,
      count: -1
    };
    this.version = 0
  }

  function Ld(e, h, a) {
    O.call(this, new Int8Array(e), h, a)
  }

  function Md(e, h, a) {
    O.call(this, new Uint8Array(e), h, a)
  }

  function Nd(e,
    h, a) {
    O.call(this, new Uint8ClampedArray(e), h, a)
  }

  function Od(e, h, a) {
    O.call(this, new Int16Array(e), h, a)
  }

  function bc(e, h, a) {
    O.call(this, new Uint16Array(e), h, a)
  }

  function Pd(e, h, a) {
    O.call(this, new Int32Array(e), h, a)
  }

  function cc(e, h, a) {
    O.call(this, new Uint32Array(e), h, a)
  }

  function F(e, h, a) {
    O.call(this, new Float32Array(e), h, a)
  }

  function Qd(e, h, a) {
    O.call(this, new Float64Array(e), h, a)
  }

  function Vh() {
    this.vertices = [];
    this.normals = [];
    this.colors = [];
    this.uvs = [];
    this.uvs2 = [];
    this.groups = [];
    this.morphTargets = {};
    this.skinWeights = [];
    this.skinIndices = [];
    this.boundingSphere = this.boundingBox = null;
    this.groupsNeedUpdate = this.uvsNeedUpdate = this.colorsNeedUpdate = this.normalsNeedUpdate = this.verticesNeedUpdate = !1
  }

  function Wh(e) {
    if (0 === e.length) return -Infinity;
    for (var h = e[0], a = 1, b = e.length; a < b; ++a) e[a] > h && (h = e[a]);
    return h
  }

  function G() {
    Object.defineProperty(this, "id", {
      value: Rj += 2
    });
    this.uuid = N.generateUUID();
    this.name = "";
    this.type = "BufferGeometry";
    this.index = null;
    this.attributes = {};
    this.morphAttributes = {};
    this.groups = [];
    this.boundingSphere =
      this.boundingBox = null;
    this.drawRange = {
      start: 0,
      count: Infinity
    };
    this.userData = {}
  }

  function ia(e, h) {
    E.call(this);
    this.type = "Mesh";
    this.geometry = void 0 !== e ? e : new G;
    this.material = void 0 !== h ? h : new Ia({
      color: 16777215 * Math.random()
    });
    this.drawMode = 0;
    this.updateMorphTargets()
  }

  function Xh(e, h, a, b, c, d, f, g) {
    if (null === (1 === h.side ? b.intersectTriangle(f, d, c, !0, g) : b.intersectTriangle(c, d, f, 2 !== h.side, g))) return null;
    Xe.copy(g);
    Xe.applyMatrix4(e.matrixWorld);
    h = a.ray.origin.distanceTo(Xe);
    return h < a.near || h > a.far ? null : {
      distance: h,
      point: Xe.clone(),
      object: e
    }
  }

  function Ye(e, h, a, b, c, d, f, g, k, m, n) {
    dc.fromBufferAttribute(c, k);
    ec.fromBufferAttribute(c, m);
    fc.fromBufferAttribute(c, n);
    c = e.morphTargetInfluences;
    if (h.morphTargets && d && c) {
      wg.set(0, 0, 0);
      xg.set(0, 0, 0);
      yg.set(0, 0, 0);
      for (var p = 0, y = d.length; p < y; p++) {
        var t = c[p],
          r = d[p];
        0 !== t && (Yh.fromBufferAttribute(r, k), Zh.fromBufferAttribute(r, m), $h.fromBufferAttribute(r, n), wg.addScaledVector(Yh.sub(dc), t), xg.addScaledVector(Zh.sub(ec), t), yg.addScaledVector($h.sub(fc), t))
      }
      dc.add(wg);
      ec.add(xg);
      fc.add(yg)
    }
    if (e = Xh(e, h, a, b, dc, ec, fc, Rd)) f && (Nc.fromBufferAttribute(f, k), Oc.fromBufferAttribute(f, m), Pc.fromBufferAttribute(f, n), e.uv = va.getUV(Rd, dc, ec, fc, Nc, Oc, Pc, new z)), g && (Nc.fromBufferAttribute(g, k), Oc.fromBufferAttribute(g, m), Pc.fromBufferAttribute(g, n), e.uv2 = va.getUV(Rd, dc, ec, fc, Nc, Oc, Pc, new z)), f = new Mc(k, m, n), va.getNormal(dc, ec, fc, f.normal), e.face = f;
    return e
  }

  function P() {
    Object.defineProperty(this, "id", {
      value: Sj += 2
    });
    this.uuid = N.generateUUID();
    this.name = "";
    this.type = "Geometry";
    this.vertices = [];
    this.colors = [];
    this.faces = [];
    this.faceVertexUvs = [
      []
    ];
    this.morphTargets = [];
    this.morphNormals = [];
    this.skinWeights = [];
    this.skinIndices = [];
    this.lineDistances = [];
    this.boundingSphere = this.boundingBox = null;
    this.groupsNeedUpdate = this.lineDistancesNeedUpdate = this.colorsNeedUpdate = this.normalsNeedUpdate = this.uvsNeedUpdate = this.verticesNeedUpdate = this.elementsNeedUpdate = !1
  }

  function gc(e) {
    var h = {},
      a;
    for (a in e) {
      h[a] = {};
      for (var b in e[a]) {
        var c = e[a][b];
        c && (c.isColor || c.isMatrix3 || c.isMatrix4 ||
          c.isVector2 || c.isVector3 || c.isVector4 || c.isTexture) ? h[a][b] = c.clone() : Array.isArray(c) ? h[a][b] = c.slice() : h[a][b] = c
      }
    }
    return h
  }

  function za(e) {
    for (var h = {}, a = 0; a < e.length; a++) {
      var b = gc(e[a]),
        c;
      for (c in b) h[c] = b[c]
    }
    return h
  }

  function Aa(e) {
    R.call(this);
    this.type = "ShaderMaterial";
    this.defines = {};
    this.uniforms = {};
    this.vertexShader = "void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}";
    this.fragmentShader = "void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}";
    this.linewidth = 1;
    this.wireframe = !1;
    this.wireframeLinewidth = 1;
    this.morphNormals = this.morphTargets = this.skinning = this.clipping = this.lights = this.fog = !1;
    this.extensions = {
      derivatives: !1,
      fragDepth: !1,
      drawBuffers: !1,
      shaderTextureLOD: !1
    };
    this.defaultAttributeValues = {
      color: [1, 1, 1],
      uv: [0, 0],
      uv2: [0, 0]
    };
    this.index0AttributeName = void 0;
    this.uniformsNeedUpdate = !1;
    void 0 !== e && (void 0 !== e.attributes && console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."), this.setValues(e))
  }

  function hb() {
    E.call(this);
    this.type = "Camera";
    this.matrixWorldInverse = new I;
    this.projectionMatrix = new I;
    this.projectionMatrixInverse = new I
  }

  function na(e, h, a, b) {
    hb.call(this);
    this.type = "PerspectiveCamera";
    this.fov = void 0 !== e ? e : 50;
    this.zoom = 1;
    this.near = void 0 !== a ? a : .1;
    this.far = void 0 !== b ? b : 2E3;
    this.focus = 10;
    this.aspect = void 0 !== h ? h : 1;
    this.view = null;
    this.filmGauge = 35;
    this.filmOffset = 0;
    this.updateProjectionMatrix()
  }

  function Qc(e, h, a, b) {
    E.call(this);
    this.type = "CubeCamera";
    var c = new na(90, 1, e, h);
    c.up.set(0, -1, 0);
    c.lookAt(new q(1, 0, 0));
    this.add(c);
    var d = new na(90, 1, e, h);
    d.up.set(0, -1, 0);
    d.lookAt(new q(-1, 0, 0));
    this.add(d);
    var f = new na(90, 1, e, h);
    f.up.set(0, 0, 1);
    f.lookAt(new q(0, 1, 0));
    this.add(f);
    var g = new na(90, 1, e, h);
    g.up.set(0, 0, -1);
    g.lookAt(new q(0, -1, 0));
    this.add(g);
    var k = new na(90, 1, e, h);
    k.up.set(0, -1, 0);
    k.lookAt(new q(0, 0, 1));
    this.add(k);
    var m = new na(90, 1, e, h);
    m.up.set(0, -1, 0);
    m.lookAt(new q(0, 0, -1));
    this.add(m);
    b = b || {
      format: 1022,
      magFilter: 1006,
      minFilter: 1006
    };
    this.renderTarget = new Ib(a, a, b);
    this.renderTarget.texture.name =
      "CubeCamera";
    this.update = function(a, b) {
      null === this.parent && this.updateMatrixWorld();
      var e = a.getRenderTarget(),
        h = this.renderTarget,
        n = h.texture.generateMipmaps;
      h.texture.generateMipmaps = !1;
      a.setRenderTarget(h, 0);
      a.render(b, c);
      a.setRenderTarget(h, 1);
      a.render(b, d);
      a.setRenderTarget(h, 2);
      a.render(b, f);
      a.setRenderTarget(h, 3);
      a.render(b, g);
      a.setRenderTarget(h, 4);
      a.render(b, k);
      h.texture.generateMipmaps = n;
      a.setRenderTarget(h, 5);
      a.render(b, m);
      a.setRenderTarget(e)
    };
    this.clear = function(a, b, c, d) {
      for (var e = a.getRenderTarget(),
          f = this.renderTarget, g = 0; 6 > g; g++) a.setRenderTarget(f, g), a.clear(b, c, d);
      a.setRenderTarget(e)
    }
  }

  function Ib(e, h, a) {
    sa.call(this, e, h, a)
  }

  function hc(e, h, a, b, c, d, f, g, k, m, n, p) {
    S.call(this, null, d, f, g, k, m, b, c, n, p);
    this.image = {
      data: e || null,
      width: h || 1,
      height: a || 1
    };
    this.magFilter = void 0 !== k ? k : 1003;
    this.minFilter = void 0 !== m ? m : 1003;
    this.flipY = this.generateMipmaps = !1;
    this.unpackAlignment = 1;
    this.needsUpdate = !0
  }

  function Sd(e, h, a, b, c, d) {
    this.planes = [void 0 !== e ? e : new Sa, void 0 !== h ? h : new Sa, void 0 !== a ? a : new Sa, void 0 !==
      b ? b : new Sa, void 0 !== c ? c : new Sa, void 0 !== d ? d : new Sa
    ]
  }

  function zg() {
    function e(c, d) {
      !1 !== a && (b(c, d), h.requestAnimationFrame(e))
    }
    var h = null,
      a = !1,
      b = null;
    return {
      start: function() {
        !0 !== a && null !== b && (h.requestAnimationFrame(e), a = !0)
      },
      stop: function() {
        a = !1
      },
      setAnimationLoop: function(a) {
        b = a
      },
      setContext: function(a) {
        h = a
      }
    }
  }

  function Tj(e) {
    function h(a, c) {
      var b = a.array,
        f = a.usage,
        g = e.createBuffer();
      e.bindBuffer(c, g);
      e.bufferData(c, b, f);
      a.onUploadCallback();
      c = 5126;
      b instanceof Float32Array ? c = 5126 : b instanceof Float64Array ?
        console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.") : b instanceof Uint16Array ? c = 5123 : b instanceof Int16Array ? c = 5122 : b instanceof Uint32Array ? c = 5125 : b instanceof Int32Array ? c = 5124 : b instanceof Int8Array ? c = 5120 : b instanceof Uint8Array && (c = 5121);
      return {
        buffer: g,
        type: c,
        bytesPerElement: b.BYTES_PER_ELEMENT,
        version: a.version
      }
    }
    var a = new WeakMap;
    return {
      get: function(b) {
        b.isInterleavedBufferAttribute && (b = b.data);
        return a.get(b)
      },
      remove: function(b) {
        b.isInterleavedBufferAttribute &&
          (b = b.data);
        var c = a.get(b);
        c && (e.deleteBuffer(c.buffer), a.delete(b))
      },
      update: function(b, c) {
        b.isInterleavedBufferAttribute && (b = b.data);
        var d = a.get(b);
        if (void 0 === d) a.set(b, h(b, c));
        else if (d.version < b.version) {
          var f = b.array,
            g = b.updateRange;
          e.bindBuffer(c, d.buffer); - 1 === g.count ? e.bufferSubData(c, 0, f) : (e.bufferSubData(c, g.offset * f.BYTES_PER_ELEMENT, f.subarray(g.offset, g.offset + g.count)), g.count = -1);
          d.version = b.version
        }
      }
    }
  }

  function Td(e, h, a, b) {
    P.call(this);
    this.type = "PlaneGeometry";
    this.parameters = {
      width: e,
      height: h,
      widthSegments: a,
      heightSegments: b
    };
    this.fromBufferGeometry(new ic(e, h, a, b));
    this.mergeVertices()
  }

  function ic(e, h, a, b) {
    G.call(this);
    this.type = "PlaneBufferGeometry";
    this.parameters = {
      width: e,
      height: h,
      widthSegments: a,
      heightSegments: b
    };
    e = e || 1;
    h = h || 1;
    var c = e / 2,
      d = h / 2;
    a = Math.floor(a) || 1;
    b = Math.floor(b) || 1;
    var f = a + 1,
      g = b + 1,
      k = e / a,
      m = h / b,
      n = [],
      p = [],
      y = [],
      t = [];
    for (e = 0; e < g; e++) {
      var r = e * m - d;
      for (h = 0; h < f; h++) p.push(h * k - c, -r, 0), y.push(0, 0, 1), t.push(h / a), t.push(1 - e / b)
    }
    for (e = 0; e < b; e++)
      for (h = 0; h < a; h++) c = h + f * (e + 1),
        d = h + 1 + f * (e + 1), g = h + 1 + f * e, n.push(h + f * e, c, g), n.push(c, d, g);
    this.setIndex(n);
    this.setAttribute("position", new F(p, 3));
    this.setAttribute("normal", new F(y, 3));
    this.setAttribute("uv", new F(t, 2))
  }

  function Uj(e, h, a, b) {
    function c(a, c) {
      h.buffers.color.setClear(a.r, a.g, a.b, c, b)
    }
    var d = new D(0),
      f = 0,
      g, k, m = null,
      n = 0;
    return {
      getClearColor: function() {
        return d
      },
      setClearColor: function(a, b) {
        d.set(a);
        f = void 0 !== b ? b : 1;
        c(d, f)
      },
      getClearAlpha: function() {
        return f
      },
      setClearAlpha: function(a) {
        f = a;
        c(d, f)
      },
      render: function(b, h, t, r) {
        h =
          h.background;
        t = e.vr;
        (t = t.getSession && t.getSession()) && "additive" === t.environmentBlendMode && (h = null);
        null === h ? (c(d, f), m = null, n = 0) : h && h.isColor && (c(h, 1), r = !0, m = null, n = 0);
        (e.autoClear || r) && e.clear(e.autoClearColor, e.autoClearDepth, e.autoClearStencil);
        if (h && (h.isCubeTexture || h.isWebGLRenderTargetCube)) {
          void 0 === k && (k = new ia(new Ud(1, 1, 1), new Aa({
            type: "BackgroundCubeMaterial",
            uniforms: gc(ib.cube.uniforms),
            vertexShader: ib.cube.vertexShader,
            fragmentShader: ib.cube.fragmentShader,
            side: 1,
            depthTest: !1,
            depthWrite: !1,
            fog: !1
          })), k.geometry.deleteAttribute("normal"), k.geometry.deleteAttribute("uv"), k.onBeforeRender = function(a, b, c) {
            this.matrixWorld.copyPosition(c.matrixWorld)
          }, Object.defineProperty(k.material, "map", {
            get: function() {
              return this.uniforms.tCube.value
            }
          }), a.update(k));
          r = h.isWebGLRenderTargetCube ? h.texture : h;
          k.material.uniforms.tCube.value = r;
          k.material.uniforms.tFlip.value = h.isWebGLRenderTargetCube ? 1 : -1;
          if (m !== h || n !== r.version) k.material.needsUpdate = !0, m = h, n = r.version;
          b.unshift(k, k.geometry, k.material, 0,
            0, null)
        } else if (h && h.isTexture) {
          void 0 === g && (g = new ia(new ic(2, 2), new Aa({
            type: "BackgroundMaterial",
            uniforms: gc(ib.background.uniforms),
            vertexShader: ib.background.vertexShader,
            fragmentShader: ib.background.fragmentShader,
            side: 0,
            depthTest: !1,
            depthWrite: !1,
            fog: !1
          })), g.geometry.deleteAttribute("normal"), Object.defineProperty(g.material, "map", {
            get: function() {
              return this.uniforms.t2D.value
            }
          }), a.update(g));
          g.material.uniforms.t2D.value = h;
          !0 === h.matrixAutoUpdate && h.updateMatrix();
          g.material.uniforms.uvTransform.value.copy(h.matrix);
          if (m !== h || n !== h.version) g.material.needsUpdate = !0, m = h, n = h.version;
          b.unshift(g, g.geometry, g.material, 0, 0, null)
        }
      }
    }
  }

  function Vj(e, h, a, b) {
    var c = b.isWebGL2,
      d;
    this.setMode = function(a) {
      d = a
    };
    this.render = function(b, c) {
      e.drawArrays(d, b, c);
      a.update(c, d)
    };
    this.renderInstances = function(b, g, k, m) {
      if (0 !== m) {
        if (c) {
          b = e;
          var f = "drawArraysInstanced"
        } else if (b = h.get("ANGLE_instanced_arrays"), f = "drawArraysInstancedANGLE", null === b) {
          console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");
          return
        }
        b[f](d, g, k, m);
        a.update(k, d, m)
      }
    }
  }

  function Wj(e, h, a) {
    function b(a) {
      if ("highp" === a) {
        if (0 < e.getShaderPrecisionFormat(35633, 36338).precision && 0 < e.getShaderPrecisionFormat(35632, 36338).precision) return "highp";
        a = "mediump"
      }
      return "mediump" === a && 0 < e.getShaderPrecisionFormat(35633, 36337).precision && 0 < e.getShaderPrecisionFormat(35632, 36337).precision ? "mediump" : "lowp"
    }
    var c, d = "undefined" !== typeof WebGL2RenderingContext && e instanceof WebGL2RenderingContext || "undefined" !== typeof WebGL2ComputeRenderingContext &&
      e instanceof WebGL2ComputeRenderingContext,
      f = void 0 !== a.precision ? a.precision : "highp",
      g = b(f);
    g !== f && (console.warn("THREE.WebGLRenderer:", f, "not supported, using", g, "instead."), f = g);
    a = !0 === a.logarithmicDepthBuffer;
    g = e.getParameter(34930);
    var k = e.getParameter(35660),
      m = e.getParameter(3379),
      n = e.getParameter(34076),
      p = e.getParameter(34921),
      y = e.getParameter(36347),
      t = e.getParameter(36348),
      r = e.getParameter(36349),
      l = 0 < k,
      v = d || !!h.get("OES_texture_float"),
      q = l && v,
      x = d ? e.getParameter(36183) : 0;
    return {
      isWebGL2: d,
      getMaxAnisotropy: function() {
        if (void 0 !== c) return c;
        var a = h.get("EXT_texture_filter_anisotropic");
        return c = null !== a ? e.getParameter(a.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 0
      },
      getMaxPrecision: b,
      precision: f,
      logarithmicDepthBuffer: a,
      maxTextures: g,
      maxVertexTextures: k,
      maxTextureSize: m,
      maxCubemapSize: n,
      maxAttributes: p,
      maxVertexUniforms: y,
      maxVaryings: t,
      maxFragmentUniforms: r,
      vertexTextures: l,
      floatFragmentTextures: v,
      floatVertexTextures: q,
      maxSamples: x
    }
  }

  function Xj() {
    function e() {
      m.value !== b && (m.value = b, m.needsUpdate =
        0 < c);
      a.numPlanes = c;
      a.numIntersection = 0
    }

    function h(b, c, d, e) {
      var f = null !== b ? b.length : 0,
        h = null;
      if (0 !== f) {
        h = m.value;
        if (!0 !== e || null === h) {
          e = d + 4 * f;
          c = c.matrixWorldInverse;
          k.getNormalMatrix(c);
          if (null === h || h.length < e) h = new Float32Array(e);
          for (e = 0; e !== f; ++e, d += 4) g.copy(b[e]).applyMatrix4(c, k), g.normal.toArray(h, d), h[d + 3] = g.constant
        }
        m.value = h;
        m.needsUpdate = !0
      }
      a.numPlanes = f;
      return h
    }
    var a = this,
      b = null,
      c = 0,
      d = !1,
      f = !1,
      g = new Sa,
      k = new ka,
      m = {
        value: null,
        needsUpdate: !1
      };
    this.uniform = m;
    this.numIntersection = this.numPlanes =
      0;
    this.init = function(a, e, f) {
      var g = 0 !== a.length || e || 0 !== c || d;
      d = e;
      b = h(a, f, 0);
      c = a.length;
      return g
    };
    this.beginShadows = function() {
      f = !0;
      h(null)
    };
    this.endShadows = function() {
      f = !1;
      e()
    };
    this.setState = function(a, g, k, t, r, l) {
      if (!d || null === a || 0 === a.length || f && !k) f ? h(null) : e();
      else {
        k = f ? 0 : c;
        var n = 4 * k,
          p = r.clippingState || null;
        m.value = p;
        p = h(a, t, n, l);
        for (a = 0; a !== n; ++a) p[a] = b[a];
        r.clippingState = p;
        this.numIntersection = g ? this.numPlanes : 0;
        this.numPlanes += k
      }
    }
  }

  function Yj(e) {
    var h = {};
    return {
      get: function(a) {
        if (void 0 !== h[a]) return h[a];
        switch (a) {
          case "WEBGL_depth_texture":
            var b = e.getExtension("WEBGL_depth_texture") || e.getExtension("MOZ_WEBGL_depth_texture") || e.getExtension("WEBKIT_WEBGL_depth_texture");
            break;
          case "EXT_texture_filter_anisotropic":
            b = e.getExtension("EXT_texture_filter_anisotropic") || e.getExtension("MOZ_EXT_texture_filter_anisotropic") || e.getExtension("WEBKIT_EXT_texture_filter_anisotropic");
            break;
          case "WEBGL_compressed_texture_s3tc":
            b = e.getExtension("WEBGL_compressed_texture_s3tc") || e.getExtension("MOZ_WEBGL_compressed_texture_s3tc") ||
              e.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");
            break;
          case "WEBGL_compressed_texture_pvrtc":
            b = e.getExtension("WEBGL_compressed_texture_pvrtc") || e.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");
            break;
          default:
            b = e.getExtension(a)
        }
        null === b && console.warn("THREE.WebGLRenderer: " + a + " extension not supported.");
        return h[a] = b
      }
    }
  }

  function Zj(e, h, a) {
    function b(c) {
      var e = c.target;
      c = d.get(e);
      null !== c.index && h.remove(c.index);
      for (var g in c.attributes) h.remove(c.attributes[g]);
      e.removeEventListener("dispose",
        b);
      d.delete(e);
      if (g = f.get(c)) h.remove(g), f.delete(c);
      a.memory.geometries--
    }

    function c(a) {
      var b = [],
        c = a.index,
        d = a.attributes.position;
      if (null !== c) {
        var e = c.array;
        c = c.version;
        d = 0;
        for (var g = e.length; d < g; d += 3) {
          var t = e[d + 0],
            r = e[d + 1],
            l = e[d + 2];
          b.push(t, r, r, l, l, t)
        }
      } else
        for (e = d.array, c = d.version, d = 0, g = e.length / 3 - 1; d < g; d += 3) t = d + 0, r = d + 1, l = d + 2, b.push(t, r, r, l, l, t);
      b = new(65535 < Wh(b) ? cc : bc)(b, 1);
      b.version = c;
      h.update(b, 34963);
      (e = f.get(a)) && h.remove(e);
      f.set(a, b)
    }
    var d = new WeakMap,
      f = new WeakMap;
    return {
      get: function(c,
        e) {
        var f = d.get(e);
        if (f) return f;
        e.addEventListener("dispose", b);
        e.isBufferGeometry ? f = e : e.isGeometry && (void 0 === e._bufferGeometry && (e._bufferGeometry = (new G).setFromObject(c)), f = e._bufferGeometry);
        d.set(e, f);
        a.memory.geometries++;
        return f
      },
      update: function(a) {
        var b = a.index,
          c = a.attributes;
        null !== b && h.update(b, 34963);
        for (var d in c) h.update(c[d], 34962);
        a = a.morphAttributes;
        for (d in a) {
          b = a[d];
          c = 0;
          for (var e = b.length; c < e; c++) h.update(b[c], 34962)
        }
      },
      getWireframeAttribute: function(a) {
        var b = f.get(a);
        if (b) {
          var d =
            a.index;
          null !== d && b.version < d.version && c(a)
        } else c(a);
        return f.get(a)
      }
    }
  }

  function ak(e, h, a, b) {
    var c = b.isWebGL2,
      d, f, g;
    this.setMode = function(a) {
      d = a
    };
    this.setIndex = function(a) {
      f = a.type;
      g = a.bytesPerElement
    };
    this.render = function(b, c) {
      e.drawElements(d, c, f, b * g);
      a.update(c, d)
    };
    this.renderInstances = function(b, m, n, p) {
      if (0 !== p) {
        if (c) {
          b = e;
          var k = "drawElementsInstanced"
        } else if (b = h.get("ANGLE_instanced_arrays"), k = "drawElementsInstancedANGLE", null === b) {
          console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");
          return
        }
        b[k](d, n, f, m * g, p);
        a.update(n, d, p)
      }
    }
  }

  function bk(e) {
    var h = {
      frame: 0,
      calls: 0,
      triangles: 0,
      points: 0,
      lines: 0
    };
    return {
      memory: {
        geometries: 0,
        textures: 0
      },
      render: h,
      programs: null,
      autoReset: !0,
      reset: function() {
        h.frame++;
        h.calls = 0;
        h.triangles = 0;
        h.points = 0;
        h.lines = 0
      },
      update: function(a, b, c) {
        c = c || 1;
        h.calls++;
        switch (b) {
          case 4:
            h.triangles += a / 3 * c;
            break;
          case 5:
          case 6:
            h.triangles += c * (a - 2);
            break;
          case 1:
            h.lines += a / 2 * c;
            break;
          case 3:
            h.lines += c * (a - 1);
            break;
          case 2:
            h.lines += c * a;
            break;
          case 0:
            h.points += c * a;
            break;
          default:
            console.error("THREE.WebGLInfo: Unknown draw mode:",
              b)
        }
      }
    }
  }

  function ck(e, h) {
    return Math.abs(h[1]) - Math.abs(e[1])
  }

  function dk(e) {
    var h = {},
      a = new Float32Array(8);
    return {
      update: function(b, c, d, f) {
        var g = b.morphTargetInfluences,
          k = g.length;
        b = h[c.id];
        if (void 0 === b) {
          b = [];
          for (var m = 0; m < k; m++) b[m] = [m, 0];
          h[c.id] = b
        }
        var n = d.morphTargets && c.morphAttributes.position;
        d = d.morphNormals && c.morphAttributes.normal;
        for (m = 0; m < k; m++) {
          var p = b[m];
          0 !== p[1] && (n && c.deleteAttribute("morphTarget" + m), d && c.deleteAttribute("morphNormal" + m))
        }
        for (m = 0; m < k; m++) p = b[m], p[0] = m, p[1] = g[m];
        b.sort(ck);
        for (m = 0; 8 > m; m++) {
          if (p = b[m])
            if (g = p[0], k = p[1]) {
              n && c.setAttribute("morphTarget" + m, n[g]);
              d && c.setAttribute("morphNormal" + m, d[g]);
              a[m] = k;
              continue
            }
          a[m] = 0
        }
        f.getUniforms().setValue(e, "morphTargetInfluences", a)
      }
    }
  }

  function ek(e, h, a, b) {
    var c = {};
    return {
      update: function(d) {
        var e = b.render.frame,
          g = d.geometry,
          k = h.get(d, g);
        c[k.id] !== e && (g.isGeometry && k.updateFromObject(d), h.update(k), c[k.id] = e);
        d.isInstancedMesh && a.update(d.instanceMatrix, 34962);
        return k
      },
      dispose: function() {
        c = {}
      }
    }
  }

  function vb(e, h, a, b, c, d, f, g, k, m) {
    e =
      void 0 !== e ? e : [];
    S.call(this, e, void 0 !== h ? h : 301, a, b, c, d, void 0 !== f ? f : 1022, g, k, m);
    this.flipY = !1
  }

  function Rc(e, h, a, b) {
    S.call(this, null);
    this.image = {
      data: e || null,
      width: h || 1,
      height: a || 1,
      depth: b || 1
    };
    this.minFilter = this.magFilter = 1003;
    this.wrapR = 1001;
    this.flipY = this.generateMipmaps = !1;
    this.needsUpdate = !0
  }

  function Sc(e, h, a, b) {
    S.call(this, null);
    this.image = {
      data: e || null,
      width: h || 1,
      height: a || 1,
      depth: b || 1
    };
    this.minFilter = this.magFilter = 1003;
    this.wrapR = 1001;
    this.flipY = this.generateMipmaps = !1;
    this.needsUpdate = !0
  }

  function Tc(e, h, a) {
    var b = e[0];
    if (0 >= b || 0 < b) return e;
    var c = h * a,
      d = ai[c];
    void 0 === d && (d = new Float32Array(c), ai[c] = d);
    if (0 !== h)
      for (b.toArray(d, 0), b = 1, c = 0; b !== h; ++b) c += a, e[b].toArray(d, c);
    return d
  }

  function Oa(e, h) {
    if (e.length !== h.length) return !1;
    for (var a = 0, b = e.length; a < b; a++)
      if (e[a] !== h[a]) return !1;
    return !0
  }

  function Ja(e, h) {
    for (var a = 0, b = h.length; a < b; a++) e[a] = h[a]
  }

  function bi(e, h) {
    var a = ci[h];
    void 0 === a && (a = new Int32Array(h), ci[h] = a);
    for (var b = 0; b !== h; ++b) a[b] = e.allocateTextureUnit();
    return a
  }

  function fk(e,
    h) {
    var a = this.cache;
    a[0] !== h && (e.uniform1f(this.addr, h), a[0] = h)
  }

  function gk(e, h) {
    var a = this.cache;
    if (void 0 !== h.x) {
      if (a[0] !== h.x || a[1] !== h.y) e.uniform2f(this.addr, h.x, h.y), a[0] = h.x, a[1] = h.y
    } else Oa(a, h) || (e.uniform2fv(this.addr, h), Ja(a, h))
  }

  function hk(e, h) {
    var a = this.cache;
    if (void 0 !== h.x) {
      if (a[0] !== h.x || a[1] !== h.y || a[2] !== h.z) e.uniform3f(this.addr, h.x, h.y, h.z), a[0] = h.x, a[1] = h.y, a[2] = h.z
    } else if (void 0 !== h.r) {
      if (a[0] !== h.r || a[1] !== h.g || a[2] !== h.b) e.uniform3f(this.addr, h.r, h.g, h.b), a[0] = h.r, a[1] = h.g,
        a[2] = h.b
    } else Oa(a, h) || (e.uniform3fv(this.addr, h), Ja(a, h))
  }

  function ik(e, h) {
    var a = this.cache;
    if (void 0 !== h.x) {
      if (a[0] !== h.x || a[1] !== h.y || a[2] !== h.z || a[3] !== h.w) e.uniform4f(this.addr, h.x, h.y, h.z, h.w), a[0] = h.x, a[1] = h.y, a[2] = h.z, a[3] = h.w
    } else Oa(a, h) || (e.uniform4fv(this.addr, h), Ja(a, h))
  }

  function jk(e, h) {
    var a = this.cache,
      b = h.elements;
    void 0 === b ? Oa(a, h) || (e.uniformMatrix2fv(this.addr, !1, h), Ja(a, h)) : Oa(a, b) || (di.set(b), e.uniformMatrix2fv(this.addr, !1, di), Ja(a, b))
  }

  function kk(e, h) {
    var a = this.cache,
      b = h.elements;
    void 0 === b ? Oa(a, h) || (e.uniformMatrix3fv(this.addr, !1, h), Ja(a, h)) : Oa(a, b) || (ei.set(b), e.uniformMatrix3fv(this.addr, !1, ei), Ja(a, b))
  }

  function lk(e, h) {
    var a = this.cache,
      b = h.elements;
    void 0 === b ? Oa(a, h) || (e.uniformMatrix4fv(this.addr, !1, h), Ja(a, h)) : Oa(a, b) || (fi.set(b), e.uniformMatrix4fv(this.addr, !1, fi), Ja(a, b))
  }

  function mk(e, h, a) {
    var b = this.cache,
      c = a.allocateTextureUnit();
    b[0] !== c && (e.uniform1i(this.addr, c), b[0] = c);
    a.safeSetTexture2D(h || gi, c)
  }

  function nk(e, h, a) {
    var b = this.cache,
      c = a.allocateTextureUnit();
    b[0] !== c && (e.uniform1i(this.addr, c), b[0] = c);
    a.setTexture2DArray(h || ok, c)
  }

  function pk(e, h, a) {
    var b = this.cache,
      c = a.allocateTextureUnit();
    b[0] !== c && (e.uniform1i(this.addr, c), b[0] = c);
    a.setTexture3D(h || qk, c)
  }

  function rk(e, h, a) {
    var b = this.cache,
      c = a.allocateTextureUnit();
    b[0] !== c && (e.uniform1i(this.addr, c), b[0] = c);
    a.safeSetTextureCube(h || hi, c)
  }

  function sk(e, h) {
    var a = this.cache;
    a[0] !== h && (e.uniform1i(this.addr, h), a[0] = h)
  }

  function tk(e, h) {
    var a = this.cache;
    Oa(a, h) || (e.uniform2iv(this.addr, h), Ja(a, h))
  }

  function uk(e,
    h) {
    var a = this.cache;
    Oa(a, h) || (e.uniform3iv(this.addr, h), Ja(a, h))
  }

  function vk(e, h) {
    var a = this.cache;
    Oa(a, h) || (e.uniform4iv(this.addr, h), Ja(a, h))
  }

  function wk(e) {
    switch (e) {
      case 5126:
        return fk;
      case 35664:
        return gk;
      case 35665:
        return hk;
      case 35666:
        return ik;
      case 35674:
        return jk;
      case 35675:
        return kk;
      case 35676:
        return lk;
      case 35678:
      case 36198:
        return mk;
      case 35679:
        return pk;
      case 35680:
        return rk;
      case 36289:
        return nk;
      case 5124:
      case 35670:
        return sk;
      case 35667:
      case 35671:
        return tk;
      case 35668:
      case 35672:
        return uk;
      case 35669:
      case 35673:
        return vk
    }
  }

  function xk(e, h) {
    e.uniform1fv(this.addr, h)
  }

  function yk(e, h) {
    e.uniform1iv(this.addr, h)
  }

  function zk(e, h) {
    e.uniform2iv(this.addr, h)
  }

  function Ak(e, h) {
    e.uniform3iv(this.addr, h)
  }

  function Bk(e, h) {
    e.uniform4iv(this.addr, h)
  }

  function Ck(e, h) {
    h = Tc(h, this.size, 2);
    e.uniform2fv(this.addr, h)
  }

  function Dk(e, h) {
    h = Tc(h, this.size, 3);
    e.uniform3fv(this.addr, h)
  }

  function Ek(e, h) {
    h = Tc(h, this.size, 4);
    e.uniform4fv(this.addr, h)
  }

  function Fk(e, h) {
    h = Tc(h, this.size, 4);
    e.uniformMatrix2fv(this.addr, !1, h)
  }

  function Gk(e, h) {
    h = Tc(h, this.size, 9);
    e.uniformMatrix3fv(this.addr, !1, h)
  }

  function Hk(e, h) {
    h = Tc(h, this.size, 16);
    e.uniformMatrix4fv(this.addr, !1, h)
  }

  function Ik(e, h, a) {
    var b = h.length,
      c = bi(a, b);
    e.uniform1iv(this.addr, c);
    for (e = 0; e !== b; ++e) a.safeSetTexture2D(h[e] || gi, c[e])
  }

  function Jk(e, h, a) {
    var b = h.length,
      c = bi(a, b);
    e.uniform1iv(this.addr, c);
    for (e = 0; e !== b; ++e) a.safeSetTextureCube(h[e] || hi, c[e])
  }

  function Kk(e) {
    switch (e) {
      case 5126:
        return xk;
      case 35664:
        return Ck;
      case 35665:
        return Dk;
      case 35666:
        return Ek;
      case 35674:
        return Fk;
      case 35675:
        return Gk;
      case 35676:
        return Hk;
      case 35678:
        return Ik;
      case 35680:
        return Jk;
      case 5124:
      case 35670:
        return yk;
      case 35667:
      case 35671:
        return zk;
      case 35668:
      case 35672:
        return Ak;
      case 35669:
      case 35673:
        return Bk
    }
  }

  function Lk(e, h, a) {
    this.id = e;
    this.addr = a;
    this.cache = [];
    this.setValue = wk(h.type)
  }

  function ii(e, h, a) {
    this.id = e;
    this.addr = a;
    this.cache = [];
    this.size = h.size;
    this.setValue = Kk(h.type)
  }

  function ji(e) {
    this.id = e;
    this.seq = [];
    this.map = {}
  }

  function Jb(e, h) {
    this.seq = [];
    this.map = {};
    for (var a =
        e.getProgramParameter(h, 35718), b = 0; b < a; ++b) {
      var c = e.getActiveUniform(h, b),
        d = e.getUniformLocation(h, c.name),
        f = this,
        g = c.name,
        k = g.length;
      for (Ag.lastIndex = 0;;) {
        var m = Ag.exec(g),
          n = Ag.lastIndex,
          p = m[1],
          y = m[3];
        "]" === m[2] && (p |= 0);
        if (void 0 === y || "[" === y && n + 2 === k) {
          g = f;
          c = void 0 === y ? new Lk(p, c, d) : new ii(p, c, d);
          g.seq.push(c);
          g.map[c.id] = c;
          break
        } else y = f.map[p], void 0 === y && (y = new ji(p), p = f, f = y, p.seq.push(f), p.map[f.id] = f), f = y
      }
    }
  }

  function ki(e, h, a) {
    h = e.createShader(h);
    e.shaderSource(h, a);
    e.compileShader(h);
    return h
  }

  function li(e) {
    switch (e) {
      case 3E3:
        return ["Linear", "( value )"];
      case 3001:
        return ["sRGB", "( value )"];
      case 3002:
        return ["RGBE", "( value )"];
      case 3004:
        return ["RGBM", "( value, 7.0 )"];
      case 3005:
        return ["RGBM", "( value, 16.0 )"];
      case 3006:
        return ["RGBD", "( value, 256.0 )"];
      case 3007:
        return ["Gamma", "( value, float( GAMMA_FACTOR ) )"];
      case 3003:
        return ["LogLuv", "( value )"];
      default:
        throw Error("unsupported encoding: " + e);
    }
  }

  function mi(e, h, a) {
    var b = e.getShaderParameter(h, 35713),
      c = e.getShaderInfoLog(h).trim();
    if (b && "" === c) return "";
    e = e.getShaderSource(h).split("\n");
    for (h = 0; h < e.length; h++) e[h] = h + 1 + ": " + e[h];
    e = e.join("\n");
    return "THREE.WebGLShader: gl.getShaderInfoLog() " + a + "\n" + c + e
  }

  function Ze(e, h) {
    h = li(h);
    return "vec4 " + e + "( vec4 value ) { return " + h[0] + "ToLinear" + h[1] + "; }"
  }

  function Mk(e, h) {
    h = li(h);
    return "vec4 " + e + "( vec4 value ) { return LinearTo" + h[0] + h[1] + "; }"
  }

  function Nk(e, h) {
    switch (h) {
      case 1:
        h = "Linear";
        break;
      case 2:
        h = "Reinhard";
        break;
      case 3:
        h = "Uncharted2";
        break;
      case 4:
        h = "OptimizedCineon";
        break;
      case 5:
        h =
          "ACESFilmic";
        break;
      default:
        throw Error("unsupported toneMapping: " + h);
    }
    return "vec3 " + e + "( vec3 color ) { return " + h + "ToneMapping( color ); }"
  }

  function Ok(e, h, a) {
    e = e || {};
    return [e.derivatives || h.envMapCubeUV || h.bumpMap || h.tangentSpaceNormalMap || h.clearcoatNormalMap || h.flatShading ? "#extension GL_OES_standard_derivatives : enable" : "", (e.fragDepth || h.logarithmicDepthBuffer) && a.get("EXT_frag_depth") ? "#extension GL_EXT_frag_depth : enable" : "", e.drawBuffers && a.get("WEBGL_draw_buffers") ? "#extension GL_EXT_draw_buffers : require" :
      "", (e.shaderTextureLOD || h.envMap) && a.get("EXT_shader_texture_lod") ? "#extension GL_EXT_shader_texture_lod : enable" : ""
    ].filter(Vd).join("\n")
  }

  function Pk(e) {
    var h = [],
      a;
    for (a in e) {
      var b = e[a];
      !1 !== b && h.push("#define " + a + " " + b)
    }
    return h.join("\n")
  }

  function Vd(e) {
    return "" !== e
  }

  function ni(e, h) {
    return e.replace(/NUM_DIR_LIGHTS/g, h.numDirLights).replace(/NUM_SPOT_LIGHTS/g, h.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g, h.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g, h.numPointLights).replace(/NUM_HEMI_LIGHTS/g,
      h.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g, h.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS/g, h.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g, h.numPointLightShadows)
  }

  function oi(e, h) {
    return e.replace(/NUM_CLIPPING_PLANES/g, h.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g, h.numClippingPlanes - h.numClipIntersection)
  }

  function Bg(e, h) {
    e = Q[h];
    if (void 0 === e) throw Error("Can not resolve #include <" + h + ">");
    return e.replace(Cg, Bg)
  }

  function pi(e, h, a, b) {
    e = "";
    for (h = parseInt(h); h < parseInt(a); h++) e +=
      b.replace(/\[ i \]/g, "[ " + h + " ]").replace(/UNROLLED_LOOP_INDEX/g, h);
    return e
  }

  function qi(e) {
    var h = "precision " + e.precision + " float;\nprecision " + e.precision + " int;";
    "highp" === e.precision ? h += "\n#define HIGH_PRECISION" : "mediump" === e.precision ? h += "\n#define MEDIUM_PRECISION" : "lowp" === e.precision && (h += "\n#define LOW_PRECISION");
    return h
  }

  function Qk(e) {
    var h = "SHADOWMAP_TYPE_BASIC";
    1 === e.shadowMapType ? h = "SHADOWMAP_TYPE_PCF" : 2 === e.shadowMapType ? h = "SHADOWMAP_TYPE_PCF_SOFT" : 3 === e.shadowMapType && (h = "SHADOWMAP_TYPE_VSM");
    return h
  }

  function Rk(e) {
    var h = "ENVMAP_TYPE_CUBE";
    if (e.envMap) switch (e.envMapMode) {
      case 301:
      case 302:
        h = "ENVMAP_TYPE_CUBE";
        break;
      case 306:
      case 307:
        h = "ENVMAP_TYPE_CUBE_UV";
        break;
      case 303:
      case 304:
        h = "ENVMAP_TYPE_EQUIREC";
        break;
      case 305:
        h = "ENVMAP_TYPE_SPHERE"
    }
    return h
  }

  function Sk(e) {
    var h = "ENVMAP_MODE_REFLECTION";
    if (e.envMap) switch (e.envMapMode) {
      case 302:
      case 304:
        h = "ENVMAP_MODE_REFRACTION"
    }
    return h
  }

  function Tk(e) {
    var h = "ENVMAP_BLENDING_MULTIPLY";
    if (e.envMap) switch (e.combine) {
      case 0:
        h = "ENVMAP_BLENDING_MULTIPLY";
        break;
      case 1:
        h = "ENVMAP_BLENDING_MIX";
        break;
      case 2:
        h = "ENVMAP_BLENDING_ADD"
    }
    return h
  }

  function Uk(e, h, a, b, c, d) {
    var f = e.getContext(),
      g = b.defines,
      k = c.vertexShader,
      m = c.fragmentShader,
      n = Qk(d),
      p = Rk(d),
      y = Sk(d),
      t = Tk(d),
      r = 0 < e.gammaFactor ? e.gammaFactor : 1,
      l = d.isWebGL2 ? "" : Ok(b.extensions, d, h),
      v = Pk(g),
      q = f.createProgram(),
      x = d.numMultiviewViews;
    b.isRawShaderMaterial ? (g = [v].filter(Vd).join("\n"), 0 < g.length && (g += "\n"), h = [l, v].filter(Vd).join("\n"), 0 < h.length && (h += "\n")) : (g = [qi(d), "#define SHADER_NAME " + c.name, v, d.instancing ?
      "#define USE_INSTANCING" : "", d.supportsVertexTextures ? "#define VERTEX_TEXTURES" : "", "#define GAMMA_FACTOR " + r, "#define MAX_BONES " + d.maxBones, d.useFog && d.fog ? "#define USE_FOG" : "", d.useFog && d.fogExp2 ? "#define FOG_EXP2" : "", d.map ? "#define USE_MAP" : "", d.envMap ? "#define USE_ENVMAP" : "", d.envMap ? "#define " + y : "", d.lightMap ? "#define USE_LIGHTMAP" : "", d.aoMap ? "#define USE_AOMAP" : "", d.emissiveMap ? "#define USE_EMISSIVEMAP" : "", d.bumpMap ? "#define USE_BUMPMAP" : "", d.normalMap ? "#define USE_NORMALMAP" : "", d.normalMap &&
      d.objectSpaceNormalMap ? "#define OBJECTSPACE_NORMALMAP" : "", d.normalMap && d.tangentSpaceNormalMap ? "#define TANGENTSPACE_NORMALMAP" : "", d.clearcoatNormalMap ? "#define USE_CLEARCOAT_NORMALMAP" : "", d.displacementMap && d.supportsVertexTextures ? "#define USE_DISPLACEMENTMAP" : "", d.specularMap ? "#define USE_SPECULARMAP" : "", d.roughnessMap ? "#define USE_ROUGHNESSMAP" : "", d.metalnessMap ? "#define USE_METALNESSMAP" : "", d.alphaMap ? "#define USE_ALPHAMAP" : "", d.vertexTangents ? "#define USE_TANGENT" : "", d.vertexColors ? "#define USE_COLOR" :
      "", d.vertexUvs ? "#define USE_UV" : "", d.uvsVertexOnly ? "#define UVS_VERTEX_ONLY" : "", d.flatShading ? "#define FLAT_SHADED" : "", d.skinning ? "#define USE_SKINNING" : "", d.useVertexTexture ? "#define BONE_TEXTURE" : "", d.morphTargets ? "#define USE_MORPHTARGETS" : "", d.morphNormals && !1 === d.flatShading ? "#define USE_MORPHNORMALS" : "", d.doubleSided ? "#define DOUBLE_SIDED" : "", d.flipSided ? "#define FLIP_SIDED" : "", d.shadowMapEnabled ? "#define USE_SHADOWMAP" : "", d.shadowMapEnabled ? "#define " + n : "", d.sizeAttenuation ? "#define USE_SIZEATTENUATION" :
      "", d.logarithmicDepthBuffer ? "#define USE_LOGDEPTHBUF" : "", d.logarithmicDepthBuffer && (d.isWebGL2 || h.get("EXT_frag_depth")) ? "#define USE_LOGDEPTHBUF_EXT" : "", "uniform mat4 modelMatrix;", "uniform mat4 modelViewMatrix;", "uniform mat4 projectionMatrix;", "uniform mat4 viewMatrix;", "uniform mat3 normalMatrix;", "uniform vec3 cameraPosition;", "uniform bool isOrthographic;", "#ifdef USE_INSTANCING", " attribute mat4 instanceMatrix;", "#endif", "attribute vec3 position;", "attribute vec3 normal;", "attribute vec2 uv;",
      "#ifdef USE_TANGENT", "\tattribute vec4 tangent;", "#endif", "#ifdef USE_COLOR", "\tattribute vec3 color;", "#endif", "#ifdef USE_MORPHTARGETS", "\tattribute vec3 morphTarget0;", "\tattribute vec3 morphTarget1;", "\tattribute vec3 morphTarget2;", "\tattribute vec3 morphTarget3;", "\t#ifdef USE_MORPHNORMALS", "\t\tattribute vec3 morphNormal0;", "\t\tattribute vec3 morphNormal1;", "\t\tattribute vec3 morphNormal2;", "\t\tattribute vec3 morphNormal3;", "\t#else", "\t\tattribute vec3 morphTarget4;", "\t\tattribute vec3 morphTarget5;",
      "\t\tattribute vec3 morphTarget6;", "\t\tattribute vec3 morphTarget7;", "\t#endif", "#endif", "#ifdef USE_SKINNING", "\tattribute vec4 skinIndex;", "\tattribute vec4 skinWeight;", "#endif", "\n"
    ].filter(Vd).join("\n"), h = [l, qi(d), "#define SHADER_NAME " + c.name, v, d.alphaTest ? "#define ALPHATEST " + d.alphaTest + (d.alphaTest % 1 ? "" : ".0") : "", "#define GAMMA_FACTOR " + r, d.useFog && d.fog ? "#define USE_FOG" : "", d.useFog && d.fogExp2 ? "#define FOG_EXP2" : "", d.map ? "#define USE_MAP" : "", d.matcap ? "#define USE_MATCAP" : "", d.envMap ? "#define USE_ENVMAP" :
      "", d.envMap ? "#define " + p : "", d.envMap ? "#define " + y : "", d.envMap ? "#define " + t : "", d.lightMap ? "#define USE_LIGHTMAP" : "", d.aoMap ? "#define USE_AOMAP" : "", d.emissiveMap ? "#define USE_EMISSIVEMAP" : "", d.bumpMap ? "#define USE_BUMPMAP" : "", d.normalMap ? "#define USE_NORMALMAP" : "", d.normalMap && d.objectSpaceNormalMap ? "#define OBJECTSPACE_NORMALMAP" : "", d.normalMap && d.tangentSpaceNormalMap ? "#define TANGENTSPACE_NORMALMAP" : "", d.clearcoatNormalMap ? "#define USE_CLEARCOAT_NORMALMAP" : "", d.specularMap ? "#define USE_SPECULARMAP" :
      "", d.roughnessMap ? "#define USE_ROUGHNESSMAP" : "", d.metalnessMap ? "#define USE_METALNESSMAP" : "", d.alphaMap ? "#define USE_ALPHAMAP" : "", d.sheen ? "#define USE_SHEEN" : "", d.vertexTangents ? "#define USE_TANGENT" : "", d.vertexColors ? "#define USE_COLOR" : "", d.vertexUvs ? "#define USE_UV" : "", d.uvsVertexOnly ? "#define UVS_VERTEX_ONLY" : "", d.gradientMap ? "#define USE_GRADIENTMAP" : "", d.flatShading ? "#define FLAT_SHADED" : "", d.doubleSided ? "#define DOUBLE_SIDED" : "", d.flipSided ? "#define FLIP_SIDED" : "", d.shadowMapEnabled ? "#define USE_SHADOWMAP" :
      "", d.shadowMapEnabled ? "#define " + n : "", d.premultipliedAlpha ? "#define PREMULTIPLIED_ALPHA" : "", d.physicallyCorrectLights ? "#define PHYSICALLY_CORRECT_LIGHTS" : "", d.logarithmicDepthBuffer ? "#define USE_LOGDEPTHBUF" : "", d.logarithmicDepthBuffer && (d.isWebGL2 || h.get("EXT_frag_depth")) ? "#define USE_LOGDEPTHBUF_EXT" : "", (b.extensions && b.extensions.shaderTextureLOD || d.envMap) && (d.isWebGL2 || h.get("EXT_shader_texture_lod")) ? "#define TEXTURE_LOD_EXT" : "", "uniform mat4 viewMatrix;", "uniform vec3 cameraPosition;", "uniform bool isOrthographic;",
      0 !== d.toneMapping ? "#define TONE_MAPPING" : "", 0 !== d.toneMapping ? Q.tonemapping_pars_fragment : "", 0 !== d.toneMapping ? Nk("toneMapping", d.toneMapping) : "", d.dithering ? "#define DITHERING" : "", d.outputEncoding || d.mapEncoding || d.matcapEncoding || d.envMapEncoding || d.emissiveMapEncoding ? Q.encodings_pars_fragment : "", d.mapEncoding ? Ze("mapTexelToLinear", d.mapEncoding) : "", d.matcapEncoding ? Ze("matcapTexelToLinear", d.matcapEncoding) : "", d.envMapEncoding ? Ze("envMapTexelToLinear", d.envMapEncoding) : "", d.emissiveMapEncoding ?
      Ze("emissiveMapTexelToLinear", d.emissiveMapEncoding) : "", d.outputEncoding ? Mk("linearToOutputTexel", d.outputEncoding) : "", d.depthPacking ? "#define DEPTH_PACKING " + b.depthPacking : "", "\n"
    ].filter(Vd).join("\n"));
    k = k.replace(Cg, Bg);
    k = ni(k, d);
    k = oi(k, d);
    m = m.replace(Cg, Bg);
    m = ni(m, d);
    m = oi(m, d);
    k = k.replace(ri, pi);
    m = m.replace(ri, pi);
    d.isWebGL2 && !b.isRawShaderMaterial && (n = !1, p = /^\s*#version\s+300\s+es\s*\n/, b.isShaderMaterial && null !== k.match(p) && null !== m.match(p) && (n = !0, k = k.replace(p, ""), m = m.replace(p, "")), g = "#version 300 es\n\n#define attribute in\n#define varying out\n#define texture2D texture\n" +
      g, h = ["#version 300 es\n\n#define varying in", n ? "" : "out highp vec4 pc_fragColor;", n ? "" : "#define gl_FragColor pc_fragColor", "#define gl_FragDepthEXT gl_FragDepth\n#define texture2D texture\n#define textureCube texture\n#define texture2DProj textureProj\n#define texture2DLodEXT textureLod\n#define texture2DProjLodEXT textureProjLod\n#define textureCubeLodEXT textureLod\n#define texture2DGradEXT textureGrad\n#define texture2DProjGradEXT textureProjGrad\n#define textureCubeGradEXT textureGrad"].join("\n") +
      "\n" + h, 0 < x && (g = g.replace("#version 300 es\n", ["#version 300 es\n\n#extension GL_OVR_multiview2 : require", "layout(num_views = " + x + ") in;", "#define VIEW_ID gl_ViewID_OVR"].join("\n")), g = g.replace("uniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;", ["uniform mat4 modelViewMatrices[" + x + "];", "uniform mat4 projectionMatrices[" + x + "];", "uniform mat4 viewMatrices[" + x + "];", "uniform mat3 normalMatrices[" + x + "];", "#define modelViewMatrix modelViewMatrices[VIEW_ID]\n#define projectionMatrix projectionMatrices[VIEW_ID]\n#define viewMatrix viewMatrices[VIEW_ID]\n#define normalMatrix normalMatrices[VIEW_ID]"].join("\n")),
        h = h.replace("#version 300 es\n", "#version 300 es\n\n#extension GL_OVR_multiview2 : require\n#define VIEW_ID gl_ViewID_OVR"), h = h.replace("uniform mat4 viewMatrix;", ["uniform mat4 viewMatrices[" + x + "];", "#define viewMatrix viewMatrices[VIEW_ID]"].join("\n"))));
    m = h + m;
    k = ki(f, 35633, g + k);
    m = ki(f, 35632, m);
    f.attachShader(q, k);
    f.attachShader(q, m);
    void 0 !== b.index0AttributeName ? f.bindAttribLocation(q, 0, b.index0AttributeName) : !0 === d.morphTargets && f.bindAttribLocation(q, 0, "position");
    f.linkProgram(q);
    if (e.debug.checkShaderErrors) {
      e =
        f.getProgramInfoLog(q).trim();
      d = f.getShaderInfoLog(k).trim();
      n = f.getShaderInfoLog(m).trim();
      y = p = !0;
      if (!1 === f.getProgramParameter(q, 35714)) p = !1, t = mi(f, k, "vertex"), r = mi(f, m, "fragment"), console.error("THREE.WebGLProgram: shader error: ", f.getError(), "35715", f.getProgramParameter(q, 35715), "gl.getProgramInfoLog", e, t, r);
      else if ("" !== e) console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()", e);
      else if ("" === d || "" === n) y = !1;
      y && (this.diagnostics = {
        runnable: p,
        material: b,
        programLog: e,
        vertexShader: {
          log: d,
          prefix: g
        },
        fragmentShader: {
          log: n,
          prefix: h
        }
      })
    }
    f.deleteShader(k);
    f.deleteShader(m);
    var B;
    this.getUniforms = function() {
      void 0 === B && (B = new Jb(f, q));
      return B
    };
    var C;
    this.getAttributes = function() {
      if (void 0 === C) {
        for (var a = {}, b = f.getProgramParameter(q, 35721), c = 0; c < b; c++) {
          var d = f.getActiveAttrib(q, c).name;
          a[d] = f.getAttribLocation(q, d)
        }
        C = a
      }
      return C
    };
    this.destroy = function() {
      f.deleteProgram(q);
      this.program = void 0
    };
    this.name = c.name;
    this.id = Vk++;
    this.cacheKey = a;
    this.usedTimes = 1;
    this.program = q;
    this.vertexShader = k;
    this.fragmentShader =
      m;
    this.numMultiviewViews = x;
    return this
  }

  function Wk(e, h, a) {
    function b(a, b) {
      if (a) a.isTexture ? c = a.encoding : a.isWebGLRenderTarget && (console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."), c = a.texture.encoding);
      else var c = 3E3;
      3E3 === c && b && (c = 3007);
      return c
    }
    var c = [],
      d = a.isWebGL2,
      f = a.logarithmicDepthBuffer,
      g = a.floatVertexTextures,
      k = a.precision,
      m = a.maxVertexUniforms,
      n = a.vertexTextures,
      p = {
        MeshDepthMaterial: "depth",
        MeshDistanceMaterial: "distanceRGBA",
        MeshNormalMaterial: "normal",
        MeshBasicMaterial: "basic",
        MeshLambertMaterial: "lambert",
        MeshPhongMaterial: "phong",
        MeshToonMaterial: "phong",
        MeshStandardMaterial: "physical",
        MeshPhysicalMaterial: "physical",
        MeshMatcapMaterial: "matcap",
        LineBasicMaterial: "basic",
        LineDashedMaterial: "dashed",
        PointsMaterial: "points",
        ShadowMaterial: "shadow",
        SpriteMaterial: "sprite"
      },
      y = "precision isWebGL2 supportsVertexTextures outputEncoding instancing numMultiviewViews map mapEncoding matcap matcapEncoding envMap envMapMode envMapEncoding envMapCubeUV lightMap aoMap emissiveMap emissiveMapEncoding bumpMap normalMap objectSpaceNormalMap tangentSpaceNormalMap clearcoatNormalMap displacementMap specularMap roughnessMap metalnessMap gradientMap alphaMap combine vertexColors vertexTangents vertexUvs uvsVertexOnly fog useFog fogExp2 flatShading sizeAttenuation logarithmicDepthBuffer skinning maxBones useVertexTexture morphTargets morphNormals maxMorphTargets maxMorphNormals premultipliedAlpha numDirLights numPointLights numSpotLights numHemiLights numRectAreaLights numDirLightShadows numPointLightShadows numSpotLightShadows shadowMapEnabled shadowMapType toneMapping physicallyCorrectLights alphaTest doubleSided flipSided numClippingPlanes numClipIntersection depthPacking dithering sheen".split(" ");
    this.getParameters = function(c, h, y, l, q, x, B) {
      var r = p[c.type];
      if (B.isSkinnedMesh) {
        var t = B.skeleton.bones;
        if (g) t = 1024;
        else {
          var u = Math.min(Math.floor((m - 20) / 4), t.length);
          u < t.length ? (console.warn("THREE.WebGLRenderer: Skeleton has " + t.length + " bones. This GPU supports " + u + "."), t = 0) : t = u
        }
      } else t = 0;
      null !== c.precision && (k = a.getMaxPrecision(c.precision), k !== c.precision && console.warn("THREE.WebGLProgram.getParameters:", c.precision, "not supported, using", k, "instead."));
      u = e.getRenderTarget();
      return {
        isWebGL2: d,
        shaderID: r,
        precision: k,
        instancing: !0 === B.isInstancedMesh,
        supportsVertexTextures: n,
        numMultiviewViews: u && u.isWebGLMultiviewRenderTarget ? u.numViews : 0,
        outputEncoding: b(u ? u.texture : null, e.gammaOutput),
        map: !!c.map,
        mapEncoding: b(c.map, e.gammaInput),
        matcap: !!c.matcap,
        matcapEncoding: b(c.matcap, e.gammaInput),
        envMap: !!c.envMap,
        envMapMode: c.envMap && c.envMap.mapping,
        envMapEncoding: b(c.envMap, e.gammaInput),
        envMapCubeUV: !!c.envMap && (306 === c.envMap.mapping || 307 === c.envMap.mapping),
        lightMap: !!c.lightMap,
        aoMap: !!c.aoMap,
        emissiveMap: !!c.emissiveMap,
        emissiveMapEncoding: b(c.emissiveMap, e.gammaInput),
        bumpMap: !!c.bumpMap,
        normalMap: !!c.normalMap,
        objectSpaceNormalMap: 1 === c.normalMapType,
        tangentSpaceNormalMap: 0 === c.normalMapType,
        clearcoatNormalMap: !!c.clearcoatNormalMap,
        displacementMap: !!c.displacementMap,
        roughnessMap: !!c.roughnessMap,
        metalnessMap: !!c.metalnessMap,
        specularMap: !!c.specularMap,
        alphaMap: !!c.alphaMap,
        gradientMap: !!c.gradientMap,
        sheen: !!c.sheen,
        combine: c.combine,
        vertexTangents: c.normalMap && c.vertexTangents,
        vertexColors: c.vertexColors,
        vertexUvs: !!c.map || !!c.bumpMap || !!c.normalMap || !!c.specularMap || !!c.alphaMap || !!c.emissiveMap || !!c.roughnessMap || !!c.metalnessMap || !!c.clearcoatNormalMap || !!c.displacementMap,
        uvsVertexOnly: !(c.map || c.bumpMap || c.normalMap || c.specularMap || c.alphaMap || c.emissiveMap || c.roughnessMap || c.metalnessMap || c.clearcoatNormalMap) && !!c.displacementMap,
        fog: !!l,
        useFog: c.fog,
        fogExp2: l && l.isFogExp2,
        flatShading: c.flatShading,
        sizeAttenuation: c.sizeAttenuation,
        logarithmicDepthBuffer: f,
        skinning: c.skinning && 0 < t,
        maxBones: t,
        useVertexTexture: g,
        morphTargets: c.morphTargets,
        morphNormals: c.morphNormals,
        maxMorphTargets: e.maxMorphTargets,
        maxMorphNormals: e.maxMorphNormals,
        numDirLights: h.directional.length,
        numPointLights: h.point.length,
        numSpotLights: h.spot.length,
        numRectAreaLights: h.rectArea.length,
        numHemiLights: h.hemi.length,
        numDirLightShadows: h.directionalShadowMap.length,
        numPointLightShadows: h.pointShadowMap.length,
        numSpotLightShadows: h.spotShadowMap.length,
        numClippingPlanes: q,
        numClipIntersection: x,
        dithering: c.dithering,
        shadowMapEnabled: e.shadowMap.enabled &&
          0 < y.length,
        shadowMapType: e.shadowMap.type,
        toneMapping: c.toneMapped ? e.toneMapping : 0,
        physicallyCorrectLights: e.physicallyCorrectLights,
        premultipliedAlpha: c.premultipliedAlpha,
        alphaTest: c.alphaTest,
        doubleSided: 2 === c.side,
        flipSided: 1 === c.side,
        depthPacking: void 0 !== c.depthPacking ? c.depthPacking : !1
      }
    };
    this.getProgramCacheKey = function(a, b) {
      var c = [];
      b.shaderID ? c.push(b.shaderID) : (c.push(a.fragmentShader), c.push(a.vertexShader));
      if (void 0 !== a.defines)
        for (var d in a.defines) c.push(d), c.push(a.defines[d]);
      for (d =
        0; d < y.length; d++) c.push(b[y[d]]);
      c.push(a.onBeforeCompile.toString());
      c.push(e.gammaOutput);
      c.push(e.gammaFactor);
      return c.join()
    };
    this.acquireProgram = function(a, b, d, f) {
      for (var g, k = 0, m = c.length; k < m; k++) {
        var n = c[k];
        if (n.cacheKey === f) {
          g = n;
          ++g.usedTimes;
          break
        }
      }
      void 0 === g && (g = new Uk(e, h, f, a, b, d), c.push(g));
      return g
    };
    this.releaseProgram = function(a) {
      if (0 === --a.usedTimes) {
        var b = c.indexOf(a);
        c[b] = c[c.length - 1];
        c.pop();
        a.destroy()
      }
    };
    this.programs = c
  }

  function Xk() {
    var e = new WeakMap;
    return {
      get: function(h) {
        var a =
          e.get(h);
        void 0 === a && (a = {}, e.set(h, a));
        return a
      },
      remove: function(h) {
        e.delete(h)
      },
      update: function(h, a, b) {
        e.get(h)[a] = b
      },
      dispose: function() {
        e = new WeakMap
      }
    }
  }

  function Yk(e, h) {
    return e.groupOrder !== h.groupOrder ? e.groupOrder - h.groupOrder : e.renderOrder !== h.renderOrder ? e.renderOrder - h.renderOrder : e.program !== h.program ? e.program.id - h.program.id : e.material.id !== h.material.id ? e.material.id - h.material.id : e.z !== h.z ? e.z - h.z : e.id - h.id
  }

  function Zk(e, h) {
    return e.groupOrder !== h.groupOrder ? e.groupOrder - h.groupOrder :
      e.renderOrder !== h.renderOrder ? e.renderOrder - h.renderOrder : e.z !== h.z ? h.z - e.z : e.id - h.id
  }

  function si() {
    function e(b, c, e, m, n, p) {
      var f = h[a];
      void 0 === f ? (f = {
        id: b.id,
        object: b,
        geometry: c,
        material: e,
        program: e.program || d,
        groupOrder: m,
        renderOrder: b.renderOrder,
        z: n,
        group: p
      }, h[a] = f) : (f.id = b.id, f.object = b, f.geometry = c, f.material = e, f.program = e.program || d, f.groupOrder = m, f.renderOrder = b.renderOrder, f.z = n, f.group = p);
      a++;
      return f
    }
    var h = [],
      a = 0,
      b = [],
      c = [],
      d = {
        id: -1
      };
    return {
      opaque: b,
      transparent: c,
      init: function() {
        a = 0;
        b.length =
          0;
        c.length = 0
      },
      push: function(a, d, h, m, n, p) {
        a = e(a, d, h, m, n, p);
        (!0 === h.transparent ? c : b).push(a)
      },
      unshift: function(a, d, h, m, n, p) {
        a = e(a, d, h, m, n, p);
        (!0 === h.transparent ? c : b).unshift(a)
      },
      sort: function() {
        1 < b.length && b.sort(Yk);
        1 < c.length && c.sort(Zk)
      }
    }
  }

  function $k() {
    function e(a) {
      a = a.target;
      a.removeEventListener("dispose", e);
      h.delete(a)
    }
    var h = new WeakMap;
    return {
      get: function(a, b) {
        var c = h.get(a);
        if (void 0 === c) {
          var d = new si;
          h.set(a, new WeakMap);
          h.get(a).set(b, d);
          a.addEventListener("dispose", e)
        } else d = c.get(b), void 0 ===
          d && (d = new si, c.set(b, d));
        return d
      },
      dispose: function() {
        h = new WeakMap
      }
    }
  }

  function al() {
    var e = {};
    return {
      get: function(h) {
        if (void 0 !== e[h.id]) return e[h.id];
        switch (h.type) {
          case "DirectionalLight":
            var a = {
              direction: new q,
              color: new D,
              shadow: !1,
              shadowBias: 0,
              shadowRadius: 1,
              shadowMapSize: new z
            };
            break;
          case "SpotLight":
            a = {
              position: new q,
              direction: new q,
              color: new D,
              distance: 0,
              coneCos: 0,
              penumbraCos: 0,
              decay: 0,
              shadow: !1,
              shadowBias: 0,
              shadowRadius: 1,
              shadowMapSize: new z
            };
            break;
          case "PointLight":
            a = {
              position: new q,
              color: new D,
              distance: 0,
              decay: 0,
              shadow: !1,
              shadowBias: 0,
              shadowRadius: 1,
              shadowMapSize: new z,
              shadowCameraNear: 1,
              shadowCameraFar: 1E3
            };
            break;
          case "HemisphereLight":
            a = {
              direction: new q,
              skyColor: new D,
              groundColor: new D
            };
            break;
          case "RectAreaLight":
            a = {
              color: new D,
              position: new q,
              halfWidth: new q,
              halfHeight: new q
            }
        }
        return e[h.id] = a
      }
    }
  }

  function bl(e, h) {
    return (h.castShadow ? 1 : 0) - (e.castShadow ? 1 : 0)
  }

  function cl() {
    for (var e = new al, h = {
        version: 0,
        hash: {
          directionalLength: -1,
          pointLength: -1,
          spotLength: -1,
          rectAreaLength: -1,
          hemiLength: -1,
          numDirectionalShadows: -1,
          numPointShadows: -1,
          numSpotShadows: -1
        },
        ambient: [0, 0, 0],
        probe: [],
        directional: [],
        directionalShadowMap: [],
        directionalShadowMatrix: [],
        spot: [],
        spotShadowMap: [],
        spotShadowMatrix: [],
        rectArea: [],
        point: [],
        pointShadowMap: [],
        pointShadowMatrix: [],
        hemi: [],
        numDirectionalShadows: -1,
        numPointShadows: -1,
        numSpotShadows: -1
      }, a = 0; 9 > a; a++) h.probe.push(new q);
    var b = new q,
      c = new I,
      d = new I;
    return {
      setup: function(a, g, k) {
        for (var f = 0, n = 0, p = 0, y = 0; 9 > y; y++) h.probe[y].set(0, 0, 0);
        var l = g = 0,
          r = 0,
          u = 0,
          v = 0,
          q = 0,
          x =
          0,
          B = 0;
        k = k.matrixWorldInverse;
        a.sort(bl);
        y = 0;
        for (var C = a.length; y < C; y++) {
          var A = a[y],
            Ka = A.color,
            W = A.intensity,
            Ca = A.distance,
            oa = A.shadow && A.shadow.map ? A.shadow.map.texture : null;
          if (A.isAmbientLight) f += Ka.r * W, n += Ka.g * W, p += Ka.b * W;
          else if (A.isLightProbe)
            for (oa = 0; 9 > oa; oa++) h.probe[oa].addScaledVector(A.sh.coefficients[oa], W);
          else if (A.isDirectionalLight) {
            var H = e.get(A);
            H.color.copy(A.color).multiplyScalar(A.intensity);
            H.direction.setFromMatrixPosition(A.matrixWorld);
            b.setFromMatrixPosition(A.target.matrixWorld);
            H.direction.sub(b);
            H.direction.transformDirection(k);
            if (H.shadow = A.castShadow) W = A.shadow, H.shadowBias = W.bias, H.shadowRadius = W.radius, H.shadowMapSize = W.mapSize, h.directionalShadowMap[g] = oa, h.directionalShadowMatrix[g] = A.shadow.matrix, q++;
            h.directional[g] = H;
            g++
          } else if (A.isSpotLight) {
            H = e.get(A);
            H.position.setFromMatrixPosition(A.matrixWorld);
            H.position.applyMatrix4(k);
            H.color.copy(Ka).multiplyScalar(W);
            H.distance = Ca;
            H.direction.setFromMatrixPosition(A.matrixWorld);
            b.setFromMatrixPosition(A.target.matrixWorld);
            H.direction.sub(b);
            H.direction.transformDirection(k);
            H.coneCos = Math.cos(A.angle);
            H.penumbraCos = Math.cos(A.angle * (1 - A.penumbra));
            H.decay = A.decay;
            if (H.shadow = A.castShadow) W = A.shadow, H.shadowBias = W.bias, H.shadowRadius = W.radius, H.shadowMapSize = W.mapSize, h.spotShadowMap[r] = oa, h.spotShadowMatrix[r] = A.shadow.matrix, B++;
            h.spot[r] = H;
            r++
          } else if (A.isRectAreaLight) H = e.get(A), H.color.copy(Ka).multiplyScalar(W), H.position.setFromMatrixPosition(A.matrixWorld), H.position.applyMatrix4(k), d.identity(), c.copy(A.matrixWorld),
            c.premultiply(k), d.extractRotation(c), H.halfWidth.set(.5 * A.width, 0, 0), H.halfHeight.set(0, .5 * A.height, 0), H.halfWidth.applyMatrix4(d), H.halfHeight.applyMatrix4(d), h.rectArea[u] = H, u++;
          else if (A.isPointLight) {
            H = e.get(A);
            H.position.setFromMatrixPosition(A.matrixWorld);
            H.position.applyMatrix4(k);
            H.color.copy(A.color).multiplyScalar(A.intensity);
            H.distance = A.distance;
            H.decay = A.decay;
            if (H.shadow = A.castShadow) W = A.shadow, H.shadowBias = W.bias, H.shadowRadius = W.radius, H.shadowMapSize = W.mapSize, H.shadowCameraNear =
              W.camera.near, H.shadowCameraFar = W.camera.far, h.pointShadowMap[l] = oa, h.pointShadowMatrix[l] = A.shadow.matrix, x++;
            h.point[l] = H;
            l++
          } else A.isHemisphereLight && (H = e.get(A), H.direction.setFromMatrixPosition(A.matrixWorld), H.direction.transformDirection(k), H.direction.normalize(), H.skyColor.copy(A.color).multiplyScalar(W), H.groundColor.copy(A.groundColor).multiplyScalar(W), h.hemi[v] = H, v++)
        }
        h.ambient[0] = f;
        h.ambient[1] = n;
        h.ambient[2] = p;
        a = h.hash;
        if (a.directionalLength !== g || a.pointLength !== l || a.spotLength !==
          r || a.rectAreaLength !== u || a.hemiLength !== v || a.numDirectionalShadows !== q || a.numPointShadows !== x || a.numSpotShadows !== B) h.directional.length = g, h.spot.length = r, h.rectArea.length = u, h.point.length = l, h.hemi.length = v, h.directionalShadowMap.length = q, h.pointShadowMap.length = x, h.spotShadowMap.length = B, h.directionalShadowMatrix.length = q, h.pointShadowMatrix.length = x, h.spotShadowMatrix.length = B, a.directionalLength = g, a.pointLength = l, a.spotLength = r, a.rectAreaLength = u, a.hemiLength = v, a.numDirectionalShadows = q, a.numPointShadows =
          x, a.numSpotShadows = B, h.version = dl++
      },
      state: h
    }
  }

  function ti() {
    var e = new cl,
      h = [],
      a = [];
    return {
      init: function() {
        h.length = 0;
        a.length = 0
      },
      state: {
        lightsArray: h,
        shadowsArray: a,
        lights: e
      },
      setupLights: function(b) {
        e.setup(h, a, b)
      },
      pushLight: function(a) {
        h.push(a)
      },
      pushShadow: function(b) {
        a.push(b)
      }
    }
  }

  function el() {
    function e(a) {
      a = a.target;
      a.removeEventListener("dispose", e);
      h.delete(a)
    }
    var h = new WeakMap;
    return {
      get: function(a, b) {
        if (!1 === h.has(a)) {
          var c = new ti;
          h.set(a, new WeakMap);
          h.get(a).set(b, c);
          a.addEventListener("dispose",
            e)
        } else !1 === h.get(a).has(b) ? (c = new ti, h.get(a).set(b, c)) : c = h.get(a).get(b);
        return c
      },
      dispose: function() {
        h = new WeakMap
      }
    }
  }

  function Kb(e) {
    R.call(this);
    this.type = "MeshDepthMaterial";
    this.depthPacking = 3200;
    this.morphTargets = this.skinning = !1;
    this.displacementMap = this.alphaMap = this.map = null;
    this.displacementScale = 1;
    this.displacementBias = 0;
    this.wireframe = !1;
    this.wireframeLinewidth = 1;
    this.fog = !1;
    this.setValues(e)
  }

  function Lb(e) {
    R.call(this);
    this.type = "MeshDistanceMaterial";
    this.referencePosition = new q;
    this.nearDistance =
      1;
    this.farDistance = 1E3;
    this.morphTargets = this.skinning = !1;
    this.displacementMap = this.alphaMap = this.map = null;
    this.displacementScale = 1;
    this.displacementBias = 0;
    this.fog = !1;
    this.setValues(e)
  }

  function ui(e, h, a) {
    function b(a, b, c) {
      c = a << 0 | b << 1 | c << 2;
      var d = p[c];
      void 0 === d && (d = new Kb({
        depthPacking: 3201,
        morphTargets: a,
        skinning: b
      }), p[c] = d);
      return d
    }

    function c(a, b, c) {
      c = a << 0 | b << 1 | c << 2;
      var d = l[c];
      void 0 === d && (d = new Lb({
        morphTargets: a,
        skinning: b
      }), l[c] = d);
      return d
    }

    function d(a, d, f, h, g, k) {
      var m = a.geometry,
        n = b,
        p = a.customDepthMaterial;
      !0 === f.isPointLight && (n = c, p = a.customDistanceMaterial);
      void 0 === p ? (p = !1, !0 === d.morphTargets && (!0 === m.isBufferGeometry ? p = m.morphAttributes && m.morphAttributes.position && 0 < m.morphAttributes.position.length : !0 === m.isGeometry && (p = m.morphTargets && 0 < m.morphTargets.length)), m = !1, !0 === a.isSkinnedMesh && (!0 === d.skinning ? m = !0 : console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:", a)), a = n(p, m, !0 === a.isInstancedMesh)) : a = p;
      e.localClippingEnabled && !0 === d.clipShadows && 0 !== d.clippingPlanes.length &&
        (p = a.uuid, n = d.uuid, m = t[p], void 0 === m && (m = {}, t[p] = m), p = m[n], void 0 === p && (p = a.clone(), m[n] = p), a = p);
      a.visible = d.visible;
      a.wireframe = d.wireframe;
      a.side = 3 === k ? null !== d.shadowSide ? d.shadowSide : d.side : null !== d.shadowSide ? d.shadowSide : r[d.side];
      a.clipShadows = d.clipShadows;
      a.clippingPlanes = d.clippingPlanes;
      a.clipIntersection = d.clipIntersection;
      a.wireframeLinewidth = d.wireframeLinewidth;
      a.linewidth = d.linewidth;
      !0 === f.isPointLight && !0 === a.isMeshDistanceMaterial && (a.referencePosition.setFromMatrixPosition(f.matrixWorld),
        a.nearDistance = h, a.farDistance = g);
      return a
    }

    function f(a, b, c, k, m) {
      if (!1 !== a.visible) {
        if (a.layers.test(b.layers) && (a.isMesh || a.isLine || a.isPoints) && (a.castShadow || a.receiveShadow && 3 === m) && (!a.frustumCulled || g.intersectsObject(a))) {
          a.modelViewMatrix.multiplyMatrices(c.matrixWorldInverse, a.matrixWorld);
          var n = h.update(a),
            p = a.material;
          if (Array.isArray(p))
            for (var r = n.groups, l = 0, y = r.length; l < y; l++) {
              var t = r[l],
                u = p[t.materialIndex];
              u && u.visible && (u = d(a, u, k, c.near, c.far, m), e.renderBufferDirect(c, null, n, u, a,
                t))
            } else p.visible && (u = d(a, p, k, c.near, c.far, m), e.renderBufferDirect(c, null, n, u, a, null))
        }
        a = a.children;
        n = 0;
        for (p = a.length; n < p; n++) f(a[n], b, c, k, m)
      }
    }
    var g = new Sd,
      k = new z,
      m = new z,
      n = new ca,
      p = [],
      l = [],
      t = {},
      r = {
        0: 1,
        1: 0,
        2: 2
      },
      u = new Aa({
        defines: {
          SAMPLE_RATE: .25,
          HALF_SAMPLE_RATE: .125
        },
        uniforms: {
          shadow_pass: {
            value: null
          },
          resolution: {
            value: new z
          },
          radius: {
            value: 4
          }
        },
        vertexShader: "void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",
        fragmentShader: "uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include <packing>\nvoid main() {\n  float mean = 0.0;\n  float squared_mean = 0.0;\n  \n\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy  ) / resolution ) );\n  for ( float i = -1.0; i < 1.0 ; i += SAMPLE_RATE) {\n    #ifdef HORIZONAL_PASS\n      vec2 distribution = decodeHalfRGBA ( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( i, 0.0 ) * radius ) / resolution ) );\n      mean += distribution.x;\n      squared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n    #else\n      float depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0,  i )  * radius ) / resolution ) );\n      mean += depth;\n      squared_mean += depth * depth;\n    #endif\n  }\n  mean = mean * HALF_SAMPLE_RATE;\n  squared_mean = squared_mean * HALF_SAMPLE_RATE;\n  float std_dev = pow( squared_mean - mean * mean, 0.5 );\n  gl_FragColor = encodeHalfRGBA( vec2( mean, std_dev ) );\n}"
      }),
      v = u.clone();
    v.defines.HORIZONAL_PASS = 1;
    var q = new G;
    q.setAttribute("position", new O(new Float32Array([-1, -1, .5, 3, -1, .5, -1, 3, .5]), 3));
    var x = new ia(q, u),
      B = this;
    this.enabled = !1;
    this.autoUpdate = !0;
    this.needsUpdate = !1;
    this.type = 1;
    this.render = function(b, c, d) {
      if (!1 !== B.enabled && (!1 !== B.autoUpdate || !1 !== B.needsUpdate) && 0 !== b.length) {
        var p = e.getRenderTarget(),
          r = e.getActiveCubeFace(),
          l = e.getActiveMipmapLevel(),
          y = e.state;
        y.setBlending(0);
        y.buffers.color.setClear(1, 1, 1, 1);
        y.buffers.depth.setTest(!0);
        y.setScissorTest(!1);
        for (var t = 0, q = b.length; t < q; t++) {
          var w = b[t],
            C = w.shadow;
          if (void 0 === C) console.warn("THREE.WebGLShadowMap:", w, "has no shadow.");
          else {
            k.copy(C.mapSize);
            var A = C.getFrameExtents();
            k.multiply(A);
            m.copy(C.mapSize);
            if (k.x > a || k.y > a) console.warn("THREE.WebGLShadowMap:", w, "has shadow exceeding max texture size, reducing"), k.x > a && (m.x = Math.floor(a / A.x), k.x = m.x * A.x, C.mapSize.x = m.x), k.y > a && (m.y = Math.floor(a / A.y), k.y = m.y * A.y, C.mapSize.y = m.y);
            null !== C.map || C.isPointLightShadow || 3 !== this.type || (A = {
              minFilter: 1006,
              magFilter: 1006,
              format: 1023
            }, C.map = new sa(k.x, k.y, A), C.map.texture.name = w.name + ".shadowMap", C.mapPass = new sa(k.x, k.y, A), C.camera.updateProjectionMatrix());
            null === C.map && (A = {
              minFilter: 1003,
              magFilter: 1003,
              format: 1023
            }, C.map = new sa(k.x, k.y, A), C.map.texture.name = w.name + ".shadowMap", C.camera.updateProjectionMatrix());
            e.setRenderTarget(C.map);
            e.clear();
            A = C.getViewportCount();
            for (var z = 0; z < A; z++) {
              var Ka = C.getViewport(z);
              n.set(m.x * Ka.x, m.y * Ka.y, m.x * Ka.z, m.y * Ka.w);
              y.viewport(n);
              C.updateMatrices(w, z);
              g = C.getFrustum();
              f(c,
                d, C.camera, w, this.type)
            }
            C.isPointLightShadow || 3 !== this.type || (w = C, C = d, A = h.update(x), u.uniforms.shadow_pass.value = w.map.texture, u.uniforms.resolution.value = w.mapSize, u.uniforms.radius.value = w.radius, e.setRenderTarget(w.mapPass), e.clear(), e.renderBufferDirect(C, null, A, u, x, null), v.uniforms.shadow_pass.value = w.mapPass.texture, v.uniforms.resolution.value = w.mapSize, v.uniforms.radius.value = w.radius, e.setRenderTarget(w.map), e.clear(), e.renderBufferDirect(C, null, A, v, x, null))
          }
        }
        B.needsUpdate = !1;
        e.setRenderTarget(p,
          r, l)
      }
    }
  }

  function fl(e, h, a) {
    function b(a, b, c) {
      var d = new Uint8Array(4),
        f = e.createTexture();
      e.bindTexture(a, f);
      e.texParameteri(a, 10241, 9728);
      e.texParameteri(a, 10240, 9728);
      for (a = 0; a < c; a++) e.texImage2D(b + a, 0, 6408, 1, 1, 0, 6408, 5121, d);
      return f
    }

    function c(a, b) {
      q[a] = 1;
      0 === w[a] && (e.enableVertexAttribArray(a), w[a] = 1);
      x[a] !== b && ((l ? e : h.get("ANGLE_instanced_arrays"))[l ? "vertexAttribDivisor" : "vertexAttribDivisorANGLE"](a, b), x[a] = b)
    }

    function d(a) {
      !0 !== B[a] && (e.enable(a), B[a] = !0)
    }

    function f(a) {
      !1 !== B[a] && (e.disable(a),
        B[a] = !1)
    }

    function g(a, b, c, h, g, k, m, n) {
      if (0 === a) A && (f(3042), A = !1);
      else if (A || (d(3042), A = !0), 5 !== a) {
        if (a !== z || n !== E) {
          if (100 !== W || 100 !== H) e.blendEquation(32774), H = W = 100;
          if (n) switch (a) {
            case 1:
              e.blendFuncSeparate(1, 771, 1, 771);
              break;
            case 2:
              e.blendFunc(1, 1);
              break;
            case 3:
              e.blendFuncSeparate(0, 0, 769, 771);
              break;
            case 4:
              e.blendFuncSeparate(0, 768, 0, 770);
              break;
            default:
              console.error("THREE.WebGLState: Invalid blending: ", a)
          } else switch (a) {
            case 1:
              e.blendFuncSeparate(770, 771, 1, 771);
              break;
            case 2:
              e.blendFunc(770, 1);
              break;
            case 3:
              e.blendFunc(0, 769);
              break;
            case 4:
              e.blendFunc(0, 768);
              break;
            default:
              console.error("THREE.WebGLState: Invalid blending: ", a)
          }
          F = Wd = oa = Ca = null;
          z = a;
          E = n
        }
      } else {
        g = g || b;
        k = k || c;
        m = m || h;
        if (b !== W || g !== H) e.blendEquationSeparate(Uc[b], Uc[g]), W = b, H = g;
        if (c !== Ca || h !== oa || k !== Wd || m !== F) e.blendFuncSeparate(L[c], L[h], L[k], L[m]), Ca = c, oa = h, Wd = k, F = m;
        z = a;
        E = null
      }
    }

    function k(a) {
      G !== a && (a ? e.frontFace(2304) : e.frontFace(2305), G = a)
    }

    function m(a) {
      0 !== a ? (d(2884), a !== D && (1 === a ? e.cullFace(1029) : 2 === a ? e.cullFace(1028) : e.cullFace(1032))) :
        f(2884);
      D = a
    }

    function n(a, b, c) {
      if (a) {
        if (d(32823), M !== b || P !== c) e.polygonOffset(b, c), M = b, P = c
      } else f(32823)
    }

    function p(a) {
      void 0 === a && (a = 33984 + O - 1);
      N !== a && (e.activeTexture(a), N = a)
    }
    var l = a.isWebGL2,
      t = new function() {
        var a = !1,
          b = new ca,
          c = null,
          d = new ca(0, 0, 0, 0);
        return {
          setMask: function(b) {
            c === b || a || (e.colorMask(b, b, b, b), c = b)
          },
          setLocked: function(b) {
            a = b
          },
          setClear: function(a, c, f, h, g) {
            !0 === g && (a *= h, c *= h, f *= h);
            b.set(a, c, f, h);
            !1 === d.equals(b) && (e.clearColor(a, c, f, h), d.copy(b))
          },
          reset: function() {
            a = !1;
            c = null;
            d.set(-1,
              0, 0, 0)
          }
        }
      },
      r = new function() {
        var a = !1,
          b = null,
          c = null,
          h = null;
        return {
          setTest: function(a) {
            a ? d(2929) : f(2929)
          },
          setMask: function(c) {
            b === c || a || (e.depthMask(c), b = c)
          },
          setFunc: function(a) {
            if (c !== a) {
              if (a) switch (a) {
                case 0:
                  e.depthFunc(512);
                  break;
                case 1:
                  e.depthFunc(519);
                  break;
                case 2:
                  e.depthFunc(513);
                  break;
                case 3:
                  e.depthFunc(515);
                  break;
                case 4:
                  e.depthFunc(514);
                  break;
                case 5:
                  e.depthFunc(518);
                  break;
                case 6:
                  e.depthFunc(516);
                  break;
                case 7:
                  e.depthFunc(517);
                  break;
                default:
                  e.depthFunc(515)
              } else e.depthFunc(515);
              c = a
            }
          },
          setLocked: function(b) {
            a =
              b
          },
          setClear: function(a) {
            h !== a && (e.clearDepth(a), h = a)
          },
          reset: function() {
            a = !1;
            h = c = b = null
          }
        }
      },
      u = new function() {
        var a = !1,
          b = null,
          c = null,
          h = null,
          g = null,
          k = null,
          m = null,
          n = null,
          p = null;
        return {
          setTest: function(b) {
            a || (b ? d(2960) : f(2960))
          },
          setMask: function(c) {
            b === c || a || (e.stencilMask(c), b = c)
          },
          setFunc: function(a, b, d) {
            if (c !== a || h !== b || g !== d) e.stencilFunc(a, b, d), c = a, h = b, g = d
          },
          setOp: function(a, b, c) {
            if (k !== a || m !== b || n !== c) e.stencilOp(a, b, c), k = a, m = b, n = c
          },
          setLocked: function(b) {
            a = b
          },
          setClear: function(a) {
            p !== a && (e.clearStencil(a),
              p = a)
          },
          reset: function() {
            a = !1;
            p = n = m = k = g = h = c = b = null
          }
        }
      };
    a = e.getParameter(34921);
    var q = new Uint8Array(a),
      w = new Uint8Array(a),
      x = new Uint8Array(a),
      B = {},
      C = null,
      A = null,
      z = null,
      W = null,
      Ca = null,
      oa = null,
      H = null,
      Wd = null,
      F = null,
      E = !1,
      G = null,
      D = null,
      K = null,
      M = null,
      P = null,
      O = e.getParameter(35661),
      R = !1;
    a = 0;
    a = e.getParameter(7938); - 1 !== a.indexOf("WebGL") ? (a = parseFloat(/^WebGL ([0-9])/.exec(a)[1]), R = 1 <= a) : -1 !== a.indexOf("OpenGL ES") && (a = parseFloat(/^OpenGL ES ([0-9])/.exec(a)[1]), R = 2 <= a);
    var N = null,
      Ua = {},
      jc = new ca,
      vi = new ca,
      Eg = {};
    Eg[3553] = b(3553, 3553, 1);
    Eg[34067] = b(34067, 34069, 6);
    t.setClear(0, 0, 0, 1);
    r.setClear(1);
    u.setClear(0);
    d(2929);
    r.setFunc(3);
    k(!1);
    m(1);
    d(2884);
    g(0);
    var Uc = {
      100: 32774,
      101: 32778,
      102: 32779
    };
    l ? (Uc[103] = 32775, Uc[104] = 32776) : (a = h.get("EXT_blend_minmax"), null !== a && (Uc[103] = a.MIN_EXT, Uc[104] = a.MIN_EXT));
    var L = {
      200: 0,
      201: 1,
      202: 768,
      204: 770,
      210: 776,
      208: 774,
      206: 772,
      203: 769,
      205: 771,
      209: 775,
      207: 773
    };
    return {
      buffers: {
        color: t,
        depth: r,
        stencil: u
      },
      initAttributes: function() {
        for (var a = 0, b = q.length; a < b; a++) q[a] = 0
      },
      enableAttribute: function(a) {
        c(a,
          0)
      },
      enableAttributeAndDivisor: c,
      disableUnusedAttributes: function() {
        for (var a = 0, b = w.length; a !== b; ++a) w[a] !== q[a] && (e.disableVertexAttribArray(a), w[a] = 0)
      },
      enable: d,
      disable: f,
      useProgram: function(a) {
        return C !== a ? (e.useProgram(a), C = a, !0) : !1
      },
      setBlending: g,
      setMaterial: function(a, b) {
        2 === a.side ? f(2884) : d(2884);
        var c = 1 === a.side;
        b && (c = !c);
        k(c);
        1 === a.blending && !1 === a.transparent ? g(0) : g(a.blending, a.blendEquation, a.blendSrc, a.blendDst, a.blendEquationAlpha, a.blendSrcAlpha, a.blendDstAlpha, a.premultipliedAlpha);
        r.setFunc(a.depthFunc);
        r.setTest(a.depthTest);
        r.setMask(a.depthWrite);
        t.setMask(a.colorWrite);
        b = a.stencilWrite;
        u.setTest(b);
        b && (u.setMask(a.stencilWriteMask), u.setFunc(a.stencilFunc, a.stencilRef, a.stencilFuncMask), u.setOp(a.stencilFail, a.stencilZFail, a.stencilZPass));
        n(a.polygonOffset, a.polygonOffsetFactor, a.polygonOffsetUnits)
      },
      setFlipSided: k,
      setCullFace: m,
      setLineWidth: function(a) {
        a !== K && (R && e.lineWidth(a), K = a)
      },
      setPolygonOffset: n,
      setScissorTest: function(a) {
        a ? d(3089) : f(3089)
      },
      activeTexture: p,
      bindTexture: function(a,
        b) {
        null === N && p();
        var c = Ua[N];
        void 0 === c && (c = {
          type: void 0,
          texture: void 0
        }, Ua[N] = c);
        if (c.type !== a || c.texture !== b) e.bindTexture(a, b || Eg[a]), c.type = a, c.texture = b
      },
      unbindTexture: function() {
        var a = Ua[N];
        void 0 !== a && void 0 !== a.type && (e.bindTexture(a.type, null), a.type = void 0, a.texture = void 0)
      },
      compressedTexImage2D: function() {
        try {
          e.compressedTexImage2D.apply(e, arguments)
        } catch (Y) {
          console.error("THREE.WebGLState:", Y)
        }
      },
      texImage2D: function() {
        try {
          e.texImage2D.apply(e, arguments)
        } catch (Y) {
          console.error("THREE.WebGLState:",
            Y)
        }
      },
      texImage3D: function() {
        try {
          e.texImage3D.apply(e, arguments)
        } catch (Y) {
          console.error("THREE.WebGLState:", Y)
        }
      },
      scissor: function(a) {
        !1 === jc.equals(a) && (e.scissor(a.x, a.y, a.z, a.w), jc.copy(a))
      },
      viewport: function(a) {
        !1 === vi.equals(a) && (e.viewport(a.x, a.y, a.z, a.w), vi.copy(a))
      },
      reset: function() {
        for (var a = 0; a < w.length; a++) 1 === w[a] && (e.disableVertexAttribArray(a), w[a] = 0);
        B = {};
        N = null;
        Ua = {};
        D = G = z = C = null;
        t.reset();
        r.reset();
        u.reset()
      }
    }
  }

  function gl(e, h, a, b, c, d, f) {
    function g(a, b) {
      return K ? new OffscreenCanvas(a,
        b) : V.createElementNS("1999xhtml", "canvas")
    }

    function k(a, b, c, d) {
      var e = 1;
      if (a.width > d || a.height > d) e = d / Math.max(a.width, a.height);
      if (1 > e || !0 === b) {
        if ("undefined" !== typeof HTMLImageElement && a instanceof HTMLImageElement || "undefined" !== typeof HTMLCanvasElement && a instanceof HTMLCanvasElement || "undefined" !== typeof ImageBitmap && a instanceof ImageBitmap) return d = b ? N.floorPowerOfTwo : Math.floor, b = d(e * a.width), e = d(e * a.height), void 0 === D && (D = g(b, e)), c = c ? g(b, e) : D, c.width = b, c.height = e, c.getContext("2d").drawImage(a,
          0, 0, b, e), console.warn("THREE.WebGLRenderer: Texture has been resized from (" + a.width + "x" + a.height + ") to (" + b + "x" + e + ")."), c;
        "data" in a && console.warn("THREE.WebGLRenderer: Image in DataTexture is too big (" + a.width + "x" + a.height + ").")
      }
      return a
    }

    function m(a) {
      return N.isPowerOfTwo(a.width) && N.isPowerOfTwo(a.height)
    }

    function n(a, b) {
      return a.generateMipmaps && b && 1003 !== a.minFilter && 1006 !== a.minFilter
    }

    function p(a, c, d, f) {
      e.generateMipmap(a);
      b.get(c).__maxMipLevel = Math.log(Math.max(d, f)) * Math.LOG2E
    }

    function l(a,
      b) {
      if (!1 === oa) return a;
      var c = a;
      6403 === a && (5126 === b && (c = 33326), 5131 === b && (c = 33325), 5121 === b && (c = 33321));
      6407 === a && (5126 === b && (c = 34837), 5131 === b && (c = 34843), 5121 === b && (c = 32849));
      6408 === a && (5126 === b && (c = 34836), 5131 === b && (c = 34842), 5121 === b && (c = 32856));
      33325 === c || 33326 === c || 34842 === c || 34836 === c ? h.get("EXT_color_buffer_float") : (34843 === c || 34837 === c) && console.warn("THREE.WebGLRenderer: Floating point textures with RGB format not supported. Please use RGBA instead.");
      return c
    }

    function t(a) {
      return 1003 === a ||
        1004 === a || 1005 === a ? 9728 : 9729
    }

    function r(a) {
      a = a.target;
      a.removeEventListener("dispose", r);
      var c = b.get(a);
      void 0 !== c.__webglInit && (e.deleteTexture(c.__webglTexture), b.remove(a));
      a.isVideoTexture && G.delete(a);
      f.memory.textures--
    }

    function u(a) {
      a = a.target;
      a.removeEventListener("dispose", u);
      var c = b.get(a),
        d = b.get(a.texture);
      if (a) {
        void 0 !== d.__webglTexture && e.deleteTexture(d.__webglTexture);
        a.depthTexture && a.depthTexture.dispose();
        if (a.isWebGLRenderTargetCube)
          for (d = 0; 6 > d; d++) e.deleteFramebuffer(c.__webglFramebuffer[d]),
            c.__webglDepthbuffer && e.deleteRenderbuffer(c.__webglDepthbuffer[d]);
        else e.deleteFramebuffer(c.__webglFramebuffer), c.__webglDepthbuffer && e.deleteRenderbuffer(c.__webglDepthbuffer);
        if (a.isWebGLMultiviewRenderTarget) {
          e.deleteTexture(c.__webglColorTexture);
          e.deleteTexture(c.__webglDepthStencilTexture);
          f.memory.textures -= 2;
          d = 0;
          for (var h = c.__webglViewFramebuffers.length; d < h; d++) e.deleteFramebuffer(c.__webglViewFramebuffers[d])
        }
        b.remove(a.texture);
        b.remove(a)
      }
      f.memory.textures--
    }

    function q(c, d) {
      var e = b.get(c);
      if (c.isVideoTexture) {
        var h = f.render.frame;
        G.get(c) !== h && (G.set(c, h), c.update())
      }
      if (0 < c.version && e.__version !== c.version)
        if (h = c.image, void 0 === h) console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");
        else if (!1 === h.complete) console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete");
      else {
        A(e, c, d);
        return
      }
      a.activeTexture(33984 + d);
      a.bindTexture(3553, e.__webglTexture)
    }

    function w(c, f) {
      if (6 === c.image.length) {
        var h = b.get(c);
        if (0 < c.version && h.__version !==
          c.version) {
          C(h, c);
          a.activeTexture(33984 + f);
          a.bindTexture(34067, h.__webglTexture);
          e.pixelStorei(37440, c.flipY);
          var g = c && c.isCompressedTexture;
          f = c.image[0] && c.image[0].isDataTexture;
          for (var r = [], y = 0; 6 > y; y++) r[y] = g || f ? f ? c.image[y].image : c.image[y] : k(c.image[y], !1, !0, Wd);
          var t = r[0],
            u = m(t) || oa,
            q = d.convert(c.format),
            v = d.convert(c.type),
            x = l(q, v);
          B(34067, c, u);
          if (g) {
            for (y = 0; 6 > y; y++) {
              var w = r[y].mipmaps;
              for (g = 0; g < w.length; g++) {
                var A = w[g];
                1023 !== c.format && 1022 !== c.format ? null !== q ? a.compressedTexImage2D(34069 +
                  y, g, x, A.width, A.height, 0, A.data) : console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()") : a.texImage2D(34069 + y, g, x, A.width, A.height, 0, q, v, A.data)
              }
            }
            h.__maxMipLevel = w.length - 1
          } else {
            w = c.mipmaps;
            for (y = 0; 6 > y; y++)
              if (f)
                for (a.texImage2D(34069 + y, 0, x, r[y].width, r[y].height, 0, q, v, r[y].data), g = 0; g < w.length; g++) A = w[g], A = A.image[y].image, a.texImage2D(34069 + y, g + 1, x, A.width, A.height, 0, q, v, A.data);
              else
                for (a.texImage2D(34069 + y, 0, x, q, v, r[y]), g = 0; g < w.length; g++) A =
                  w[g], a.texImage2D(34069 + y, g + 1, x, q, v, A.image[y]);
            h.__maxMipLevel = w.length
          }
          n(c, u) && p(34067, c, t.width, t.height);
          h.__version = c.version;
          if (c.onUpdate) c.onUpdate(c)
        } else a.activeTexture(33984 + f), a.bindTexture(34067, h.__webglTexture)
      }
    }

    function x(c, d) {
      a.activeTexture(33984 + d);
      a.bindTexture(34067, b.get(c).__webglTexture)
    }

    function B(a, d, f) {
      f ? (e.texParameteri(a, 10242, P[d.wrapS]), e.texParameteri(a, 10243, P[d.wrapT]), 32879 !== a && 35866 !== a || e.texParameteri(a, 32882, P[d.wrapR]), e.texParameteri(a, 10240, R[d.magFilter]),
        e.texParameteri(a, 10241, R[d.minFilter])) : (e.texParameteri(a, 10242, 33071), e.texParameteri(a, 10243, 33071), 32879 !== a && 35866 !== a || e.texParameteri(a, 32882, 33071), 1001 === d.wrapS && 1001 === d.wrapT || console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."), e.texParameteri(a, 10240, t(d.magFilter)), e.texParameteri(a, 10241, t(d.minFilter)), 1003 !== d.minFilter && 1006 !== d.minFilter && console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter."));
      !(f = h.get("EXT_texture_filter_anisotropic")) || 1015 === d.type && null === h.get("OES_texture_float_linear") || 1016 === d.type && null === (oa || h.get("OES_texture_half_float_linear")) || !(1 < d.anisotropy || b.get(d).__currentAnisotropy) || (e.texParameterf(a, f.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(d.anisotropy, c.getMaxAnisotropy())), b.get(d).__currentAnisotropy = d.anisotropy)
    }

    function C(a, b) {
      void 0 === a.__webglInit && (a.__webglInit = !0, b.addEventListener("dispose", r), a.__webglTexture = e.createTexture(), f.memory.textures++)
    }

    function A(b, c, f) {
      var h = 3553;
      c.isDataTexture2DArray && (h = 35866);
      c.isDataTexture3D && (h = 32879);
      C(b, c);
      a.activeTexture(33984 + f);
      a.bindTexture(h, b.__webglTexture);
      e.pixelStorei(37440, c.flipY);
      e.pixelStorei(37441, c.premultiplyAlpha);
      e.pixelStorei(3317, c.unpackAlignment);
      f = oa ? !1 : 1001 !== c.wrapS || 1001 !== c.wrapT || 1003 !== c.minFilter && 1006 !== c.minFilter;
      f = f && !1 === m(c.image);
      f = k(c.image, f, !1, F);
      var g = m(f) || oa,
        y = d.convert(c.format),
        r = d.convert(c.type),
        t = l(y, r);
      B(h, c, g);
      var u = c.mipmaps;
      if (c.isDepthTexture) {
        t = 6402;
        if (1015 === c.type) {
          if (!1 === oa) throw Error("Float Depth Texture only supported in WebGL2.0");
          t = 36012
        } else oa && (t = 33189);
        1026 === c.format && 6402 === t && 1012 !== c.type && 1014 !== c.type && (console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."), c.type = 1012, r = d.convert(c.type));
        1027 === c.format && (t = 34041, 1020 !== c.type && (console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."), c.type = 1020, r = d.convert(c.type)));
        a.texImage2D(3553,
          0, t, f.width, f.height, 0, y, r, null)
      } else if (c.isDataTexture)
        if (0 < u.length && g) {
          for (var q = 0, v = u.length; q < v; q++) h = u[q], a.texImage2D(3553, q, t, h.width, h.height, 0, y, r, h.data);
          c.generateMipmaps = !1;
          b.__maxMipLevel = u.length - 1
        } else a.texImage2D(3553, 0, t, f.width, f.height, 0, y, r, f.data), b.__maxMipLevel = 0;
      else if (c.isCompressedTexture) {
        q = 0;
        for (v = u.length; q < v; q++) h = u[q], 1023 !== c.format && 1022 !== c.format ? null !== y ? a.compressedTexImage2D(3553, q, t, h.width, h.height, 0, h.data) : console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()") :
          a.texImage2D(3553, q, t, h.width, h.height, 0, y, r, h.data);
        b.__maxMipLevel = u.length - 1
      } else if (c.isDataTexture2DArray) a.texImage3D(35866, 0, t, f.width, f.height, f.depth, 0, y, r, f.data), b.__maxMipLevel = 0;
      else if (c.isDataTexture3D) a.texImage3D(32879, 0, t, f.width, f.height, f.depth, 0, y, r, f.data), b.__maxMipLevel = 0;
      else if (0 < u.length && g) {
        q = 0;
        for (v = u.length; q < v; q++) h = u[q], a.texImage2D(3553, q, t, y, r, h);
        c.generateMipmaps = !1;
        b.__maxMipLevel = u.length - 1
      } else a.texImage2D(3553, 0, t, y, r, f), b.__maxMipLevel = 0;
      n(c, g) && p(3553, c, f.width,
        f.height);
      b.__version = c.version;
      if (c.onUpdate) c.onUpdate(c)
    }

    function z(c, f, h, g) {
      var k = d.convert(f.texture.format),
        m = d.convert(f.texture.type),
        n = l(k, m);
      a.texImage2D(g, 0, n, f.width, f.height, 0, k, m, null);
      e.bindFramebuffer(36160, c);
      e.framebufferTexture2D(36160, h, g, b.get(f.texture).__webglTexture, 0);
      e.bindFramebuffer(36160, null)
    }

    function W(a, b, c) {
      e.bindRenderbuffer(36161, a);
      if (b.depthBuffer && !b.stencilBuffer) c ? (c = Ca(b), e.renderbufferStorageMultisample(36161, c, 33189, b.width, b.height)) : e.renderbufferStorage(36161,
        33189, b.width, b.height), e.framebufferRenderbuffer(36160, 36096, 36161, a);
      else if (b.depthBuffer && b.stencilBuffer) c ? (c = Ca(b), e.renderbufferStorageMultisample(36161, c, 35056, b.width, b.height)) : e.renderbufferStorage(36161, 34041, b.width, b.height), e.framebufferRenderbuffer(36160, 33306, 36161, a);
      else {
        a = d.convert(b.texture.format);
        var f = d.convert(b.texture.type);
        a = l(a, f);
        c ? (c = Ca(b), e.renderbufferStorageMultisample(36161, c, a, b.width, b.height)) : e.renderbufferStorage(36161, a, b.width, b.height)
      }
      e.bindRenderbuffer(36161,
        null)
    }

    function Ca(a) {
      return oa && a.isWebGLMultisampleRenderTarget ? Math.min(E, a.samples) : 0
    }
    var oa = c.isWebGL2,
      H = c.maxTextures,
      Wd = c.maxCubemapSize,
      F = c.maxTextureSize,
      E = c.maxSamples,
      G = new WeakMap,
      D, K = "undefined" !== typeof OffscreenCanvas && null !== (new OffscreenCanvas(1, 1)).getContext("2d"),
      M = 0,
      P = {
        1E3: 10497,
        1001: 33071,
        1002: 33648
      },
      R = {
        1003: 9728,
        1004: 9984,
        1005: 9986,
        1006: 9729,
        1007: 9985,
        1008: 9987
      },
      O = !1,
      I = !1;
    this.allocateTextureUnit = function() {
      var a = M;
      a >= H && console.warn("THREE.WebGLTextures: Trying to use " + a +
        " texture units while this GPU supports only " + H);
      M += 1;
      return a
    };
    this.resetTextureUnits = function() {
      M = 0
    };
    this.setTexture2D = q;
    this.setTexture2DArray = function(c, d) {
      var e = b.get(c);
      0 < c.version && e.__version !== c.version ? A(e, c, d) : (a.activeTexture(33984 + d), a.bindTexture(35866, e.__webglTexture))
    };
    this.setTexture3D = function(c, d) {
      var e = b.get(c);
      0 < c.version && e.__version !== c.version ? A(e, c, d) : (a.activeTexture(33984 + d), a.bindTexture(32879, e.__webglTexture))
    };
    this.setTextureCube = w;
    this.setTextureCubeDynamic = x;
    this.setupRenderTarget =
      function(c) {
        var g = b.get(c),
          k = b.get(c.texture);
        c.addEventListener("dispose", u);
        k.__webglTexture = e.createTexture();
        f.memory.textures++;
        var y = !0 === c.isWebGLRenderTargetCube,
          r = !0 === c.isWebGLMultisampleRenderTarget,
          t = !0 === c.isWebGLMultiviewRenderTarget,
          v = m(c) || oa;
        if (y) {
          g.__webglFramebuffer = [];
          for (var x = 0; 6 > x; x++) g.__webglFramebuffer[x] = e.createFramebuffer()
        } else if (g.__webglFramebuffer = e.createFramebuffer(), r)
          if (oa) {
            g.__webglMultisampledFramebuffer = e.createFramebuffer();
            g.__webglColorRenderbuffer = e.createRenderbuffer();
            e.bindRenderbuffer(36161, g.__webglColorRenderbuffer);
            r = d.convert(c.texture.format);
            var w = d.convert(c.texture.type);
            r = l(r, w);
            w = Ca(c);
            e.renderbufferStorageMultisample(36161, w, r, c.width, c.height);
            e.bindFramebuffer(36160, g.__webglMultisampledFramebuffer);
            e.framebufferRenderbuffer(36160, 36064, 36161, g.__webglColorRenderbuffer);
            e.bindRenderbuffer(36161, null);
            c.depthBuffer && (g.__webglDepthRenderbuffer = e.createRenderbuffer(), W(g.__webglDepthRenderbuffer, c, !0));
            e.bindFramebuffer(36160, null)
          } else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.");
        else if (t) {
          x = c.width;
          var C = c.height;
          r = c.numViews;
          e.bindFramebuffer(36160, g.__webglFramebuffer);
          var A = h.get("OVR_multiview2");
          f.memory.textures += 2;
          w = e.createTexture();
          e.bindTexture(35866, w);
          e.texParameteri(35866, 10240, 9728);
          e.texParameteri(35866, 10241, 9728);
          e.texImage3D(35866, 0, 32856, x, C, r, 0, 6408, 5121, null);
          A.framebufferTextureMultiviewOVR(36160, 36064, w, 0, 0, r);
          var H = e.createTexture();
          e.bindTexture(35866, H);
          e.texParameteri(35866, 10240, 9728);
          e.texParameteri(35866, 10241, 9728);
          e.texImage3D(35866, 0, 35056,
            x, C, r, 0, 34041, 34042, null);
          A.framebufferTextureMultiviewOVR(36160, 33306, H, 0, 0, r);
          C = Array(r);
          for (x = 0; x < r; ++x) C[x] = e.createFramebuffer(), e.bindFramebuffer(36160, C[x]), e.framebufferTextureLayer(36160, 36064, w, 0, x);
          g.__webglColorTexture = w;
          g.__webglDepthStencilTexture = H;
          g.__webglViewFramebuffers = C;
          e.bindFramebuffer(36160, null);
          e.bindTexture(35866, null)
        }
        if (y) {
          a.bindTexture(34067, k.__webglTexture);
          B(34067, c.texture, v);
          for (x = 0; 6 > x; x++) z(g.__webglFramebuffer[x], c, 36064, 34069 + x);
          n(c.texture, v) && p(34067, c.texture,
            c.width, c.height);
          a.bindTexture(34067, null)
        } else t || (a.bindTexture(3553, k.__webglTexture), B(3553, c.texture, v), z(g.__webglFramebuffer, c, 36064, 3553), n(c.texture, v) && p(3553, c.texture, c.width, c.height), a.bindTexture(3553, null));
        if (c.depthBuffer) {
          g = b.get(c);
          k = !0 === c.isWebGLRenderTargetCube;
          if (c.depthTexture) {
            if (k) throw Error("target.depthTexture not supported in Cube render targets");
            if (c && c.isWebGLRenderTargetCube) throw Error("Depth Texture with cube render targets is not supported");
            e.bindFramebuffer(36160,
              g.__webglFramebuffer);
            if (!c.depthTexture || !c.depthTexture.isDepthTexture) throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");
            b.get(c.depthTexture).__webglTexture && c.depthTexture.image.width === c.width && c.depthTexture.image.height === c.height || (c.depthTexture.image.width = c.width, c.depthTexture.image.height = c.height, c.depthTexture.needsUpdate = !0);
            q(c.depthTexture, 0);
            g = b.get(c.depthTexture).__webglTexture;
            if (1026 === c.depthTexture.format) e.framebufferTexture2D(36160, 36096,
              3553, g, 0);
            else if (1027 === c.depthTexture.format) e.framebufferTexture2D(36160, 33306, 3553, g, 0);
            else throw Error("Unknown depthTexture format");
          } else if (k)
            for (g.__webglDepthbuffer = [], k = 0; 6 > k; k++) e.bindFramebuffer(36160, g.__webglFramebuffer[k]), g.__webglDepthbuffer[k] = e.createRenderbuffer(), W(g.__webglDepthbuffer[k], c);
          else e.bindFramebuffer(36160, g.__webglFramebuffer), g.__webglDepthbuffer = e.createRenderbuffer(), W(g.__webglDepthbuffer, c);
          e.bindFramebuffer(36160, null)
        }
      };
    this.updateRenderTargetMipmap = function(c) {
      var d =
        c.texture,
        e = m(c) || oa;
      if (n(d, e)) {
        e = c.isWebGLRenderTargetCube ? 34067 : 3553;
        var f = b.get(d).__webglTexture;
        a.bindTexture(e, f);
        p(e, d, c.width, c.height);
        a.bindTexture(e, null)
      }
    };
    this.updateMultisampleRenderTarget = function(a) {
      if (a.isWebGLMultisampleRenderTarget)
        if (oa) {
          var c = b.get(a);
          e.bindFramebuffer(36008, c.__webglMultisampledFramebuffer);
          e.bindFramebuffer(36009, c.__webglFramebuffer);
          c = a.width;
          var d = a.height,
            f = 16384;
          a.depthBuffer && (f |= 256);
          a.stencilBuffer && (f |= 1024);
          e.blitFramebuffer(0, 0, c, d, 0, 0, c, d, f, 9728)
        } else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.")
    };
    this.safeSetTexture2D = function(a, b) {
      a && a.isWebGLRenderTarget && (!1 === O && (console.warn("THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead."), O = !0), a = a.texture);
      q(a, b)
    };
    this.safeSetTextureCube = function(a, b) {
      a && a.isWebGLRenderTargetCube && (!1 === I && (console.warn("THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead."), I = !0), a = a.texture);
      a && a.isCubeTexture || Array.isArray(a.image) &&
        6 === a.image.length ? w(a, b) : x(a, b)
    }
  }

  function wi(e, h, a) {
    var b = a.isWebGL2;
    return {
      convert: function(a) {
        if (1009 === a) return 5121;
        if (1017 === a) return 32819;
        if (1018 === a) return 32820;
        if (1019 === a) return 33635;
        if (1010 === a) return 5120;
        if (1011 === a) return 5122;
        if (1012 === a) return 5123;
        if (1013 === a) return 5124;
        if (1014 === a) return 5125;
        if (1015 === a) return 5126;
        if (1016 === a) {
          if (b) return 5131;
          var c = h.get("OES_texture_half_float");
          return null !== c ? c.HALF_FLOAT_OES : null
        }
        if (1021 === a) return 6406;
        if (1022 === a) return 6407;
        if (1023 ===
          a) return 6408;
        if (1024 === a) return 6409;
        if (1025 === a) return 6410;
        if (1026 === a) return 6402;
        if (1027 === a) return 34041;
        if (1028 === a) return 6403;
        if (33776 === a || 33777 === a || 33778 === a || 33779 === a)
          if (c = h.get("WEBGL_compressed_texture_s3tc"), null !== c) {
            if (33776 === a) return c.COMPRESSED_RGB_S3TC_DXT1_EXT;
            if (33777 === a) return c.COMPRESSED_RGBA_S3TC_DXT1_EXT;
            if (33778 === a) return c.COMPRESSED_RGBA_S3TC_DXT3_EXT;
            if (33779 === a) return c.COMPRESSED_RGBA_S3TC_DXT5_EXT
          } else return null;
        if (35840 === a || 35841 === a || 35842 === a || 35843 ===
          a)
          if (c = h.get("WEBGL_compressed_texture_pvrtc"), null !== c) {
            if (35840 === a) return c.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
            if (35841 === a) return c.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
            if (35842 === a) return c.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
            if (35843 === a) return c.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG
          } else return null;
        if (36196 === a) return c = h.get("WEBGL_compressed_texture_etc1"), null !== c ? c.COMPRESSED_RGB_ETC1_WEBGL : null;
        if (37808 === a || 37809 === a || 37810 === a || 37811 === a || 37812 === a || 37813 === a || 37814 === a || 37815 === a || 37816 === a || 37817 ===
          a || 37818 === a || 37819 === a || 37820 === a || 37821 === a) return c = h.get("WEBGL_compressed_texture_astc"), null !== c ? a : null;
        if (1020 === a) {
          if (b) return 34042;
          c = h.get("WEBGL_depth_texture");
          return null !== c ? c.UNSIGNED_INT_24_8_WEBGL : null
        }
      }
    }
  }

  function Fg(e, h, a, b) {
    sa.call(this, e, h, b);
    this.stencilBuffer = this.depthBuffer = !1;
    this.numViews = a
  }

  function hl(e, h) {
    function a(a) {
      if (a.isArrayCamera) return a.cameras;
      n[0] = a;
      return n
    }

    function b(a) {
      if (void 0 === a.isArrayCamera) return !0;
      a = a.cameras;
      if (a.length > l) return !1;
      for (var b = 1, c =
          a.length; b < c; b++)
        if (a[0].viewport.z !== a[b].viewport.z || a[0].viewport.w !== a[b].viewport.w) return !1;
      return !0
    }
    var c = e.extensions,
      d = e.properties,
      f, g, k, m, n, p, y, l = 0;
    this.isAvailable = function() {
      if (void 0 === y) {
        var a = c.get("OVR_multiview2");
        if (y = null !== a && !1 === h.getContextAttributes().antialias)
          for (l = h.getParameter(a.MAX_VIEWS_OVR), f = new Fg(0, 0, 2), p = new z, m = [], k = [], n = [], a = 0; a < l; a++) m[a] = new I, k[a] = new ka
      }
      return y
    };
    this.attachCamera = function(a) {
      if (!1 !== b(a)) {
        (g = e.getRenderTarget()) ? p.set(g.width, g.height):
          e.getDrawingBufferSize(p);
        if (a.isArrayCamera) {
          var c = a.cameras[0].viewport;
          f.setSize(c.z, c.w);
          f.setNumViews(a.cameras.length)
        } else f.setSize(p.x, p.y), f.setNumViews(2);
        e.setRenderTarget(f)
      }
    };
    this.detachCamera = function(a) {
      if (f === e.getRenderTarget()) {
        e.setRenderTarget(g);
        var b = f,
          c = b.numViews,
          k = d.get(b).__webglViewFramebuffers,
          m = b.width;
        b = b.height;
        if (a.isArrayCamera)
          for (var n = 0; n < c; n++) {
            var y = a.cameras[n].viewport,
              l = y.x,
              r = y.y,
              t = l + y.z;
            y = r + y.w;
            h.bindFramebuffer(36008, k[n]);
            h.blitFramebuffer(0, 0, m, b, l, r,
              t, y, 16384, 9728)
          } else h.bindFramebuffer(36008, k[0]), h.blitFramebuffer(0, 0, m, b, 0, 0, p.x, p.y, 16384, 9728)
      }
    };
    this.updateCameraProjectionMatricesUniform = function(b, c) {
      b = a(b);
      for (var d = 0; d < b.length; d++) m[d].copy(b[d].projectionMatrix);
      c.setValue(h, "projectionMatrices", m)
    };
    this.updateCameraViewMatricesUniform = function(b, c) {
      b = a(b);
      for (var d = 0; d < b.length; d++) m[d].copy(b[d].matrixWorldInverse);
      c.setValue(h, "viewMatrices", m)
    };
    this.updateObjectMatricesUniforms = function(b, c, d) {
      c = a(c);
      for (var e = 0; e < c.length; e++) m[e].multiplyMatrices(c[e].matrixWorldInverse,
        b.matrixWorld), k[e].getNormalMatrix(m[e]);
      d.setValue(h, "modelViewMatrices", m);
      d.setValue(h, "normalMatrices", k)
    }
  }

  function Vc() {
    E.call(this);
    this.type = "Group"
  }

  function Yd(e) {
    na.call(this);
    this.cameras = e || []
  }

  function xi(e, h, a) {
    yi.setFromMatrixPosition(h.matrixWorld);
    zi.setFromMatrixPosition(a.matrixWorld);
    var b = yi.distanceTo(zi),
      c = h.projectionMatrix.elements,
      d = a.projectionMatrix.elements,
      f = c[14] / (c[10] - 1);
    a = c[14] / (c[10] + 1);
    var g = (c[9] + 1) / c[5],
      k = (c[9] - 1) / c[5],
      m = (c[8] - 1) / c[0],
      n = (d[8] + 1) / d[0];
    c = f * m;
    d = f *
      n;
    n = b / (-m + n);
    m = n * -m;
    h.matrixWorld.decompose(e.position, e.quaternion, e.scale);
    e.translateX(m);
    e.translateZ(n);
    e.matrixWorld.compose(e.position, e.quaternion, e.scale);
    e.matrixWorldInverse.getInverse(e.matrixWorld);
    h = f + n;
    f = a + n;
    e.projectionMatrix.makePerspective(c - m, d + (b - m), g * a / f * h, k * a / f * h, h, f)
  }

  function Gg(e) {
    function h() {
      return null !== g && !0 === g.isPresenting
    }

    function a() {
      if (h()) {
        var a = g.getEyeParameters("left");
        c = 2 * a.renderWidth * l;
        d = a.renderHeight * l;
        Ka = e.getPixelRatio();
        e.getSize(A);
        e.setDrawingBufferSize(c,
          d, 1);
        x.viewport.set(0, 0, c / 2, d);
        B.viewport.set(c / 2, 0, c / 2, d);
        Ca.start();
        f.dispatchEvent({
          type: "sessionstart"
        })
      } else f.enabled && e.setDrawingBufferSize(A.width, A.height, Ka), Ca.stop(), f.dispatchEvent({
        type: "sessionend"
      })
    }

    function b(a, b) {
      null !== b && 4 === b.length && a.set(b[0] * c, b[1] * d, b[2] * c, b[3] * d)
    }
    var c, d, f = this,
      g = null,
      k = null,
      m = null,
      n = [],
      p = new I,
      y = new I,
      l = 1,
      r = "local-floor";
    "undefined" !== typeof kc && "VRFrameData" in kc && (k = new fa, Th("vrdisplaypresentchange", a));
    var u = new I,
      v = new ya,
      w = new q,
      x = new na;
    x.viewport =
      new ca;
    x.layers.enable(1);
    var B = new na;
    B.viewport = new ca;
    B.layers.enable(2);
    var C = new Yd([x, B]);
    C.layers.enable(1);
    C.layers.enable(2);
    var A = new z,
      Ka, W = [];
    this.enabled = !1;
    this.getController = function(a) {
      var b = n[a];
      void 0 === b && (b = new Vc, b.matrixAutoUpdate = !1, b.visible = !1, n[a] = b);
      return b
    };
    this.getDevice = function() {
      return g
    };
    this.setDevice = function(a) {
      void 0 !== a && (g = a);
      Ca.setContext(a)
    };
    this.setFramebufferScaleFactor = function(a) {
      l = a
    };
    this.setReferenceSpaceType = function(a) {
      r = a
    };
    this.setPoseTarget = function(a) {
      void 0 !==
        a && (m = a)
    };
    this.getCamera = function(a) {
      var c = "local-floor" === r ? 1.6 : 0;
      if (!1 === h()) return a.position.set(0, c, 0), a.rotation.set(0, 0, 0), a;
      g.depthNear = a.near;
      g.depthFar = a.far;
      g.getFrameData(k);
      if ("local-floor" === r) {
        var d = g.stageParameters;
        d ? p.fromArray(d.sittingToStandingTransform) : p.makeTranslation(0, c, 0)
      }
      c = k.pose;
      d = null !== m ? m : a;
      d.matrix.copy(p);
      d.matrix.decompose(d.position, d.quaternion, d.scale);
      null !== c.orientation && (v.fromArray(c.orientation), d.quaternion.multiply(v));
      null !== c.position && (v.setFromRotationMatrix(p),
        w.fromArray(c.position), w.applyQuaternion(v), d.position.add(w));
      d.updateMatrixWorld();
      x.near = a.near;
      B.near = a.near;
      x.far = a.far;
      B.far = a.far;
      x.matrixWorldInverse.fromArray(k.leftViewMatrix);
      B.matrixWorldInverse.fromArray(k.rightViewMatrix);
      y.getInverse(p);
      "local-floor" === r && (x.matrixWorldInverse.multiply(y), B.matrixWorldInverse.multiply(y));
      a = d.parent;
      null !== a && (u.getInverse(a.matrixWorld), x.matrixWorldInverse.multiply(u), B.matrixWorldInverse.multiply(u));
      x.matrixWorld.getInverse(x.matrixWorldInverse);
      B.matrixWorld.getInverse(B.matrixWorldInverse);
      x.projectionMatrix.fromArray(k.leftProjectionMatrix);
      B.projectionMatrix.fromArray(k.rightProjectionMatrix);
      xi(C, x, B);
      a = g.getLayers();
      a.length && (a = a[0], b(x.viewport, a.leftBounds), b(B.viewport, a.rightBounds));
      a: for (a = 0; a < n.length; a++) {
        c = n[a];
        b: {
          d = a;
          for (var e = navigator.getGamepads && navigator.getGamepads(), f = 0, l = e.length; f < l; f++) {
            var t = e[f];
            if (t && ("Daydream Controller" === t.id || "Gear VR Controller" === t.id || "Oculus Go Controller" === t.id || "OpenVR Gamepad" ===
                t.id || t.id.startsWith("Oculus Touch") || t.id.startsWith("HTC Vive Focus") || t.id.startsWith("Spatial Controller"))) {
              var q = t.hand;
              if (0 === d && ("" === q || "right" === q) || 1 === d && "left" === q) {
                d = t;
                break b
              }
            }
          }
          d = void 0
        }
        if (void 0 !== d && void 0 !== d.pose) {
          if (null === d.pose) break a;
          e = d.pose;
          !1 === e.hasPosition && c.position.set(.2, -.6, -.05);
          null !== e.position && c.position.fromArray(e.position);
          null !== e.orientation && c.quaternion.fromArray(e.orientation);
          c.matrix.compose(c.position, c.quaternion, c.scale);
          c.matrix.premultiply(p);
          c.matrix.decompose(c.position, c.quaternion, c.scale);
          c.matrixWorldNeedsUpdate = !0;
          c.visible = !0;
          e = "Daydream Controller" === d.id ? 0 : 1;
          void 0 === W[a] && (W[a] = !1);
          W[a] !== d.buttons[e].pressed && (W[a] = d.buttons[e].pressed, !0 === W[a] ? c.dispatchEvent({
            type: "selectstart"
          }) : (c.dispatchEvent({
            type: "selectend"
          }), c.dispatchEvent({
            type: "select"
          })))
        } else c.visible = !1
      }
      return C
    };
    this.getStandingMatrix = function() {
      return p
    };
    this.isPresenting = h;
    var Ca = new zg;
    this.setAnimationLoop = function(a) {
      Ca.setAnimationLoop(a);
      h() && Ca.start()
    };
    this.submitFrame = function() {
      h() && g.submitFrame()
    };
    this.dispose = function() {
      "undefined" !== typeof kc && Uh("vrdisplaypresentchange", a)
    };
    this.setFrameOfReferenceType = function() {
      console.warn("THREE.WebVRManager: setFrameOfReferenceType() has been deprecated.")
    }
  }

  function Ai(e, h) {
    function a() {
      return null !== m && null !== n
    }

    function b(a) {
      for (var b = 0; b < l.length; b++) r[b] === a.inputSource && l[b].dispatchEvent({
        type: a.type
      })
    }

    function c() {
      e.setFramebuffer(null);
      e.setRenderTarget(e.getRenderTarget());
      B.stop();
      k.dispatchEvent({
        type: "sessionend"
      })
    }

    function d(a) {
      n = a;
      B.setContext(m);
      B.start();
      k.dispatchEvent({
        type: "sessionstart"
      })
    }

    function f() {
      for (var a = 0; a < l.length; a++) {
        var b = a;
        a: {
          var c = m.inputSources;
          for (var d = 0; d < c.length; d++) {
            var e = c[d],
              f = e.handedness;
            if (0 === a && ("none" === f || "right" === f)) {
              c = e;
              break a
            }
            if (1 === a && "left" === f) {
              c = e;
              break a
            }
          }
          c = void 0
        }
        r[b] = c
      }
    }

    function g(a, b) {
      null === b ? a.matrixWorld.copy(a.matrix) : a.matrixWorld.multiplyMatrices(b.matrixWorld, a.matrix);
      a.matrixWorldInverse.getInverse(a.matrixWorld)
    }
    var k = this,
      m = null,
      n = null,
      p = "local-floor",
      y = null,
      l = [],
      r = [],
      u = new na;
    u.layers.enable(1);
    u.viewport = new ca;
    var q = new na;
    q.layers.enable(2);
    q.viewport = new ca;
    var w = new Yd([u, q]);
    w.layers.enable(1);
    w.layers.enable(2);
    this.enabled = !1;
    this.getController = function(a) {
      var b = l[a];
      void 0 === b && (b = new Vc, b.matrixAutoUpdate = !1, b.visible = !1, l[a] = b);
      return b
    };
    this.setFramebufferScaleFactor = function() {};
    this.setReferenceSpaceType = function(a) {
      p = a
    };
    this.getSession = function() {
      return m
    };
    this.setSession = function(a) {
      m = a;
      null !== m && (m.addEventListener("select", b),
        m.addEventListener("selectstart", b), m.addEventListener("selectend", b), m.addEventListener("end", c), m.updateRenderState({
          baseLayer: new XRWebGLLayer(m, h)
        }), m.requestReferenceSpace(p).then(d), m.addEventListener("inputsourceschange", f), f())
    };
    this.getCamera = function(b) {
      if (a()) {
        var c = b.parent,
          d = w.cameras;
        g(w, c);
        for (var e = 0; e < d.length; e++) g(d[e], c);
        b.matrixWorld.copy(w.matrixWorld);
        b = b.children;
        e = 0;
        for (c = b.length; e < c; e++) b[e].updateMatrixWorld(!0);
        xi(w, u, q);
        return w
      }
      return b
    };
    this.isPresenting = a;
    var x = null,
      B = new zg;
    B.setAnimationLoop(function(a, b) {
      y = b.getViewerPose(n);
      if (null !== y) {
        var c = y.views,
          d = m.renderState.baseLayer;
        e.setFramebuffer(d.framebuffer);
        for (var f = 0; f < c.length; f++) {
          var g = c[f],
            h = d.getViewport(g),
            k = w.cameras[f];
          k.matrix.fromArray(g.transform.inverse.matrix).getInverse(k.matrix);
          k.projectionMatrix.fromArray(g.projectionMatrix);
          k.viewport.set(h.x, h.y, h.width, h.height);
          0 === f && w.matrix.copy(k.matrix)
        }
      }
      for (f = 0; f < l.length; f++) {
        c = l[f];
        if (d = r[f])
          if (d = b.getPose(d.targetRaySpace, n), null !== d) {
            c.matrix.fromArray(d.transform.matrix);
            c.matrix.decompose(c.position, c.rotation, c.scale);
            c.visible = !0;
            continue
          }
        c.visible = !1
      }
      x && x(a)
    });
    this.setAnimationLoop = function(a) {
      x = a
    };
    this.dispose = function() {};
    this.getStandingMatrix = function() {
      console.warn("THREE.WebXRManager: getStandingMatrix() is no longer needed.");
      return new I
    };
    this.getDevice = function() {
      console.warn("THREE.WebXRManager: getDevice() has been deprecated.")
    };
    this.setDevice = function() {
      console.warn("THREE.WebXRManager: setDevice() has been deprecated.")
    };
    this.setFrameOfReferenceType =
      function() {
        console.warn("THREE.WebXRManager: setFrameOfReferenceType() has been deprecated.")
      };
    this.submitFrame = function() {}
  }

  function Hg(e) {
    var h;

    function a() {
      ta = new Yj(J);
      Ea = new Wj(J, ta, e);
      !1 === Ea.isWebGL2 && (ta.get("WEBGL_depth_texture"), ta.get("OES_texture_float"), ta.get("OES_texture_half_float"), ta.get("OES_texture_half_float_linear"), ta.get("OES_standard_derivatives"), ta.get("OES_element_index_uint"), ta.get("ANGLE_instanced_arrays"));
      ta.get("OES_texture_float_linear");
      la = new wi(J, ta, Ea);
      ba = new fl(J,
        ta, Ea);
      ba.scissor(Z.copy(ia).multiplyScalar(ha).floor());
      ba.viewport(S.copy(U).multiplyScalar(ha).floor());
      fa = new bk(J);
      aa = new Xk;
      ea = new gl(J, ta, ba, aa, Ea, la, fa);
      ka = new Tj(J);
      va = new Zj(J, ka, fa);
      ra = new ek(J, va, ka, fa);
      xa = new dk(J);
      pa = new Wk(D, ta, Ea);
      wa = new $k;
      ua = new el;
      ma = new Uj(D, ba, ra, F);
      ya = new Vj(J, ta, fa, Ea);
      Aa = new ak(J, ta, fa, Ea);
      fa.programs = pa.programs;
      D.capabilities = Ea;
      D.extensions = ta;
      D.properties = aa;
      D.renderLists = wa;
      D.state = ba;
      D.info = fa
    }

    function b(a) {
      a.preventDefault();
      console.log("THREE.WebGLRenderer: Context Lost.");
      M = !0
    }

    function c() {
      console.log("THREE.WebGLRenderer: Context Restored.");
      M = !1;
      a()
    }

    function d(a) {
      a = a.target;
      a.removeEventListener("dispose", d);
      f(a);
      aa.remove(a)
    }

    function f(a) {
      var b = aa.get(a).program;
      a.program = void 0;
      void 0 !== b && pa.releaseProgram(b)
    }

    function g(a, b) {
      a.render(function(a) {
        D.renderBufferImmediate(a, b)
      })
    }

    function k(a, b, c, d) {
      if (!1 !== a.visible) {
        if (a.layers.test(b.layers))
          if (a.isGroup) c = a.renderOrder;
          else if (a.isLOD) !0 === a.autoUpdate && a.update(b);
        else if (a.isLight) E.pushLight(a), a.castShadow &&
          E.pushShadow(a);
        else if (a.isSprite) {
          if (!a.frustumCulled || Dg.intersectsSprite(a)) {
            d && Mb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(Xd);
            var e = ra.update(a),
              f = a.material;
            f.visible && H.push(a, e, f, c, Mb.z, null)
          }
        } else if (a.isImmediateRenderObject) d && Mb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(Xd), H.push(a, null, a.material, c, Mb.z, null);
        else if (a.isMesh || a.isLine || a.isPoints)
          if (a.isSkinnedMesh && a.skeleton.frame !== fa.render.frame && (a.skeleton.update(), a.skeleton.frame = fa.render.frame), !a.frustumCulled ||
            Dg.intersectsObject(a))
            if (d && Mb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(Xd), e = ra.update(a), f = a.material, Array.isArray(f))
              for (var g = e.groups, h = 0, m = g.length; h < m; h++) {
                var n = g[h],
                  p = f[n.materialIndex];
                p && p.visible && H.push(a, e, p, c, Mb.z, n)
              } else f.visible && H.push(a, e, f, c, Mb.z, null);
        a = a.children;
        h = 0;
        for (m = a.length; h < m; h++) k(a[h], b, c, d)
      }
    }

    function m(a, b, c, d) {
      for (var e = 0, f = a.length; e < f; e++) {
        var g = a[e],
          h = g.object,
          k = g.geometry,
          m = void 0 === d ? g.material : d;
        g = g.group;
        if (c.isArrayCamera)
          if (jc = c, ja.enabled &&
            sa.isAvailable()) n(h, b, c, k, m, g);
          else
            for (var p = c.cameras, l = 0, y = p.length; l < y; l++) {
              var r = p[l];
              h.layers.test(r.layers) && (ba.viewport(S.copy(r.viewport)), E.setupLights(r), n(h, b, r, k, m, g))
            } else jc = null, n(h, b, c, k, m, g)
      }
    }

    function n(a, b, c, d, e, f) {
      a.onBeforeRender(D, b, c, d, e, f);
      E = ua.get(b, jc || c);
      a.modelViewMatrix.multiplyMatrices(c.matrixWorldInverse, a.matrixWorld);
      a.normalMatrix.getNormalMatrix(a.modelViewMatrix);
      if (a.isImmediateRenderObject) {
        ba.setMaterial(e);
        var k = y(c, b.fog, e, a);
        bf = h = null;
        T = !1;
        g(a, k)
      } else D.renderBufferDirect(c,
        b.fog, d, e, a, f);
      a.onAfterRender(D, b, c, d, e, f);
      E = ua.get(b, jc || c)
    }

    function p(a, b, c) {
      var e = aa.get(a),
        g = E.state.lights,
        h = g.state.version;
      c = pa.getParameters(a, g.state, E.state.shadowsArray, b, Ta.numPlanes, Ta.numIntersection, c);
      var k = pa.getProgramCacheKey(a, c),
        m = e.program,
        n = !0;
      if (void 0 === m) a.addEventListener("dispose", d);
      else if (m.cacheKey !== k) f(a);
      else {
        if (e.lightsStateVersion !== h) e.lightsStateVersion = h;
        else if (void 0 !== c.shaderID) return;
        n = !1
      }
      n && (c.shaderID ? (k = ib[c.shaderID], e.shader = {
        name: a.type,
        uniforms: gc(k.uniforms),
        vertexShader: k.vertexShader,
        fragmentShader: k.fragmentShader
      }) : e.shader = {
        name: a.type,
        uniforms: a.uniforms,
        vertexShader: a.vertexShader,
        fragmentShader: a.fragmentShader
      }, a.onBeforeCompile(e.shader, D), k = pa.getProgramCacheKey(a, c), m = pa.acquireProgram(a, e.shader, c, k), e.program = m, a.program = m);
      c = m.getAttributes();
      if (a.morphTargets)
        for (k = a.numSupportedMorphTargets = 0; k < D.maxMorphTargets; k++) 0 <= c["morphTarget" + k] && a.numSupportedMorphTargets++;
      if (a.morphNormals)
        for (k = a.numSupportedMorphNormals = 0; k < D.maxMorphNormals; k++) 0 <=
          c["morphNormal" + k] && a.numSupportedMorphNormals++;
      c = e.shader.uniforms;
      if (!a.isShaderMaterial && !a.isRawShaderMaterial || !0 === a.clipping) e.numClippingPlanes = Ta.numPlanes, e.numIntersection = Ta.numIntersection, c.clippingPlanes = Ta.uniform;
      e.fog = b;
      e.needsLights = a.isMeshLambertMaterial || a.isMeshPhongMaterial || a.isMeshStandardMaterial || a.isShadowMaterial || a.isShaderMaterial && !0 === a.lights;
      e.lightsStateVersion = h;
      e.needsLights && (c.ambientLightColor.value = g.state.ambient, c.lightProbe.value = g.state.probe, c.directionalLights.value =
        g.state.directional, c.spotLights.value = g.state.spot, c.rectAreaLights.value = g.state.rectArea, c.pointLights.value = g.state.point, c.hemisphereLights.value = g.state.hemi, c.directionalShadowMap.value = g.state.directionalShadowMap, c.directionalShadowMatrix.value = g.state.directionalShadowMatrix, c.spotShadowMap.value = g.state.spotShadowMap, c.spotShadowMatrix.value = g.state.spotShadowMatrix, c.pointShadowMap.value = g.state.pointShadowMap, c.pointShadowMatrix.value = g.state.pointShadowMatrix);
      a = e.program.getUniforms();
      a = Jb.seqWithValue(a.seq, c);
      e.uniformsList = a
    }

    function y(a, b, c, d) {
      ea.resetTextureUnits();
      var e = aa.get(c),
        f = E.state.lights;
      $e && (qa || a !== Ua) && Ta.setState(c.clippingPlanes, c.clipIntersection, c.clipShadows, a, e, a === Ua && c.id === af);
      !1 === c.needsUpdate && (void 0 === e.program ? c.needsUpdate = !0 : c.fog && e.fog !== b ? c.needsUpdate = !0 : e.needsLights && e.lightsStateVersion !== f.state.version ? c.needsUpdate = !0 : void 0 === e.numClippingPlanes || e.numClippingPlanes === Ta.numPlanes && e.numIntersection === Ta.numIntersection || (c.needsUpdate = !0));
      c.needsUpdate && (p(c, b, d), c.needsUpdate = !1);
      var g = !1,
        h = !1,
        k = !1;
      f = e.program;
      var m = f.getUniforms(),
        n = e.shader.uniforms;
      ba.useProgram(f.program) && (k = h = g = !0);
      c.id !== af && (af = c.id, h = !0);
      if (g || Ua !== a) {
        0 < f.numMultiviewViews ? sa.updateCameraProjectionMatricesUniform(a, m) : m.setValue(J, "projectionMatrix", a.projectionMatrix);
        Ea.logarithmicDepthBuffer && m.setValue(J, "logDepthBufFC", 2 / (Math.log(a.far + 1) / Math.LN2));
        Ua !== a && (Ua = a, k = h = !0);
        if (c.isShaderMaterial || c.isMeshPhongMaterial || c.isMeshStandardMaterial || c.envMap) g =
          m.map.cameraPosition, void 0 !== g && g.setValue(J, Mb.setFromMatrixPosition(a.matrixWorld));
        (c.isMeshPhongMaterial || c.isMeshLambertMaterial || c.isMeshBasicMaterial || c.isMeshStandardMaterial || c.isShaderMaterial) && m.setValue(J, "isOrthographic", !0 === a.isOrthographicCamera);
        if (c.isMeshPhongMaterial || c.isMeshLambertMaterial || c.isMeshBasicMaterial || c.isMeshStandardMaterial || c.isShaderMaterial || c.skinning) 0 < f.numMultiviewViews ? sa.updateCameraViewMatricesUniform(a, m) : m.setValue(J, "viewMatrix", a.matrixWorldInverse)
      }
      if (c.skinning &&
        (m.setOptional(J, d, "bindMatrix"), m.setOptional(J, d, "bindMatrixInverse"), g = d.skeleton)) {
        var y = g.bones;
        if (Ea.floatVertexTextures) {
          if (void 0 === g.boneTexture) {
            y = Math.sqrt(4 * y.length);
            y = N.ceilPowerOfTwo(y);
            y = Math.max(y, 4);
            var t = new Float32Array(y * y * 4);
            t.set(g.boneMatrices);
            var q = new hc(t, y, y, 1023, 1015);
            g.boneMatrices = t;
            g.boneTexture = q;
            g.boneTextureSize = y
          }
          m.setValue(J, "boneTexture", g.boneTexture, ea);
          m.setValue(J, "boneTextureSize", g.boneTextureSize)
        } else m.setOptional(J, g, "boneMatrices")
      }
      if (h || e.receiveShadow !==
        d.receiveShadow) e.receiveShadow = d.receiveShadow, m.setValue(J, "receiveShadow", d.receiveShadow);
      if (h) {
        m.setValue(J, "toneMappingExposure", D.toneMappingExposure);
        m.setValue(J, "toneMappingWhitePoint", D.toneMappingWhitePoint);
        e.needsLights && (h = k, n.ambientLightColor.needsUpdate = h, n.lightProbe.needsUpdate = h, n.directionalLights.needsUpdate = h, n.pointLights.needsUpdate = h, n.spotLights.needsUpdate = h, n.rectAreaLights.needsUpdate = h, n.hemisphereLights.needsUpdate = h);
        b && c.fog && (n.fogColor.value.copy(b.color), b.isFog ?
          (n.fogNear.value = b.near, n.fogFar.value = b.far) : b.isFogExp2 && (n.fogDensity.value = b.density));
        if (c.isMeshBasicMaterial) l(n, c);
        else if (c.isMeshLambertMaterial) l(n, c), c.emissiveMap && (n.emissiveMap.value = c.emissiveMap);
        else if (c.isMeshPhongMaterial) l(n, c), c.isMeshToonMaterial ? (r(n, c), c.gradientMap && (n.gradientMap.value = c.gradientMap)) : r(n, c);
        else if (c.isMeshStandardMaterial) l(n, c), c.isMeshPhysicalMaterial ? (u(n, c), n.reflectivity.value = c.reflectivity, n.clearcoat.value = c.clearcoat, n.clearcoatRoughness.value =
          c.clearcoatRoughness, c.sheen && n.sheen.value.copy(c.sheen), c.clearcoatNormalMap && (n.clearcoatNormalScale.value.copy(c.clearcoatNormalScale), n.clearcoatNormalMap.value = c.clearcoatNormalMap, 1 === c.side && n.clearcoatNormalScale.value.negate()), n.transparency.value = c.transparency) : u(n, c);
        else if (c.isMeshMatcapMaterial) l(n, c), c.matcap && (n.matcap.value = c.matcap), c.bumpMap && (n.bumpMap.value = c.bumpMap, n.bumpScale.value = c.bumpScale, 1 === c.side && (n.bumpScale.value *= -1)), c.normalMap && (n.normalMap.value = c.normalMap,
          n.normalScale.value.copy(c.normalScale), 1 === c.side && n.normalScale.value.negate()), c.displacementMap && (n.displacementMap.value = c.displacementMap, n.displacementScale.value = c.displacementScale, n.displacementBias.value = c.displacementBias);
        else if (c.isMeshDepthMaterial) l(n, c), c.displacementMap && (n.displacementMap.value = c.displacementMap, n.displacementScale.value = c.displacementScale, n.displacementBias.value = c.displacementBias);
        else if (c.isMeshDistanceMaterial) l(n, c), c.displacementMap && (n.displacementMap.value =
          c.displacementMap, n.displacementScale.value = c.displacementScale, n.displacementBias.value = c.displacementBias), n.referencePosition.value.copy(c.referencePosition), n.nearDistance.value = c.nearDistance, n.farDistance.value = c.farDistance;
        else if (c.isMeshNormalMaterial) l(n, c), c.bumpMap && (n.bumpMap.value = c.bumpMap, n.bumpScale.value = c.bumpScale, 1 === c.side && (n.bumpScale.value *= -1)), c.normalMap && (n.normalMap.value = c.normalMap, n.normalScale.value.copy(c.normalScale), 1 === c.side && n.normalScale.value.negate()), c.displacementMap &&
          (n.displacementMap.value = c.displacementMap, n.displacementScale.value = c.displacementScale, n.displacementBias.value = c.displacementBias);
        else if (c.isLineBasicMaterial) n.diffuse.value.copy(c.color), n.opacity.value = c.opacity, c.isLineDashedMaterial && (n.dashSize.value = c.dashSize, n.totalSize.value = c.dashSize + c.gapSize, n.scale.value = c.scale);
        else if (c.isPointsMaterial) {
          n.diffuse.value.copy(c.color);
          n.opacity.value = c.opacity;
          n.size.value = c.size * ha;
          n.scale.value = .5 * Y;
          c.map && (n.map.value = c.map);
          c.alphaMap && (n.alphaMap.value =
            c.alphaMap);
          if (c.map) var v = c.map;
          else c.alphaMap && (v = c.alphaMap);
          void 0 !== v && (!0 === v.matrixAutoUpdate && v.updateMatrix(), n.uvTransform.value.copy(v.matrix))
        } else if (c.isSpriteMaterial) {
          n.diffuse.value.copy(c.color);
          n.opacity.value = c.opacity;
          n.rotation.value = c.rotation;
          c.map && (n.map.value = c.map);
          c.alphaMap && (n.alphaMap.value = c.alphaMap);
          if (c.map) var x = c.map;
          else c.alphaMap && (x = c.alphaMap);
          void 0 !== x && (!0 === x.matrixAutoUpdate && x.updateMatrix(), n.uvTransform.value.copy(x.matrix))
        } else c.isShadowMaterial &&
          (n.color.value.copy(c.color), n.opacity.value = c.opacity);
        void 0 !== n.ltc_1 && (n.ltc_1.value = K.LTC_1);
        void 0 !== n.ltc_2 && (n.ltc_2.value = K.LTC_2);
        Jb.upload(J, e.uniformsList, n, ea);
        c.isShaderMaterial && (c.uniformsNeedUpdate = !1)
      }
      c.isShaderMaterial && !0 === c.uniformsNeedUpdate && (Jb.upload(J, e.uniformsList, n, ea), c.uniformsNeedUpdate = !1);
      c.isSpriteMaterial && m.setValue(J, "center", d.center);
      0 < f.numMultiviewViews ? sa.updateObjectMatricesUniforms(d, a, m) : (m.setValue(J, "modelViewMatrix", d.modelViewMatrix), m.setValue(J,
        "normalMatrix", d.normalMatrix));
      m.setValue(J, "modelMatrix", d.matrixWorld);
      return f
    }

    function l(a, b) {
      a.opacity.value = b.opacity;
      b.color && a.diffuse.value.copy(b.color);
      b.emissive && a.emissive.value.copy(b.emissive).multiplyScalar(b.emissiveIntensity);
      b.map && (a.map.value = b.map);
      b.alphaMap && (a.alphaMap.value = b.alphaMap);
      b.specularMap && (a.specularMap.value = b.specularMap);
      b.envMap && (a.envMap.value = b.envMap, a.flipEnvMap.value = b.envMap.isCubeTexture ? -1 : 1, a.reflectivity.value = b.reflectivity, a.refractionRatio.value =
        b.refractionRatio, a.maxMipLevel.value = aa.get(b.envMap).__maxMipLevel);
      b.lightMap && (a.lightMap.value = b.lightMap, a.lightMapIntensity.value = b.lightMapIntensity);
      b.aoMap && (a.aoMap.value = b.aoMap, a.aoMapIntensity.value = b.aoMapIntensity);
      if (b.map) var c = b.map;
      else b.specularMap ? c = b.specularMap : b.displacementMap ? c = b.displacementMap : b.normalMap ? c = b.normalMap : b.bumpMap ? c = b.bumpMap : b.roughnessMap ? c = b.roughnessMap : b.metalnessMap ? c = b.metalnessMap : b.alphaMap ? c = b.alphaMap : b.emissiveMap && (c = b.emissiveMap);
      void 0 !==
        c && (c.isWebGLRenderTarget && (c = c.texture), !0 === c.matrixAutoUpdate && c.updateMatrix(), a.uvTransform.value.copy(c.matrix))
    }

    function r(a, b) {
      a.specular.value.copy(b.specular);
      a.shininess.value = Math.max(b.shininess, 1E-4);
      b.emissiveMap && (a.emissiveMap.value = b.emissiveMap);
      b.bumpMap && (a.bumpMap.value = b.bumpMap, a.bumpScale.value = b.bumpScale, 1 === b.side && (a.bumpScale.value *= -1));
      b.normalMap && (a.normalMap.value = b.normalMap, a.normalScale.value.copy(b.normalScale), 1 === b.side && a.normalScale.value.negate());
      b.displacementMap &&
        (a.displacementMap.value = b.displacementMap, a.displacementScale.value = b.displacementScale, a.displacementBias.value = b.displacementBias)
    }

    function u(a, b) {
      a.roughness.value = b.roughness;
      a.metalness.value = b.metalness;
      b.roughnessMap && (a.roughnessMap.value = b.roughnessMap);
      b.metalnessMap && (a.metalnessMap.value = b.metalnessMap);
      b.emissiveMap && (a.emissiveMap.value = b.emissiveMap);
      b.bumpMap && (a.bumpMap.value = b.bumpMap, a.bumpScale.value = b.bumpScale, 1 === b.side && (a.bumpScale.value *= -1));
      b.normalMap && (a.normalMap.value =
        b.normalMap, a.normalScale.value.copy(b.normalScale), 1 === b.side && a.normalScale.value.negate());
      b.displacementMap && (a.displacementMap.value = b.displacementMap, a.displacementScale.value = b.displacementScale, a.displacementBias.value = b.displacementBias);
      b.envMap && (a.envMapIntensity.value = b.envMapIntensity)
    }
    e = e || {};
    var v = void 0 !== e.canvas ? e.canvas : V.createElementNS("1999xhtml", "canvas"),
      w = void 0 !== e.context ? e.context : null,
      x = void 0 !== e.alpha ? e.alpha : !1,
      B = void 0 !== e.depth ? e.depth : !0,
      C = void 0 !==
      e.stencil ? e.stencil : !0,
      A = void 0 !== e.antialias ? e.antialias : !1,
      F = void 0 !== e.premultipliedAlpha ? e.premultipliedAlpha : !0,
      W = void 0 !== e.preserveDrawingBuffer ? e.preserveDrawingBuffer : !1,
      Ca = void 0 !== e.powerPreference ? e.powerPreference : "default",
      G = void 0 !== e.failIfMajorPerformanceCaveat ? e.failIfMajorPerformanceCaveat : !1,
      H = null,
      E = null;
    this.domElement = v;
    this.debug = {
      checkShaderErrors: !0
    };
    this.sortObjects = this.autoClearStencil = this.autoClearDepth = this.autoClearColor = this.autoClear = !0;
    this.clippingPlanes = [];
    this.localClippingEnabled = !1;
    this.gammaFactor = 2;
    this.physicallyCorrectLights = this.gammaOutput = this.gammaInput = !1;
    this.toneMappingWhitePoint = this.toneMappingExposure = this.toneMapping = 1;
    this.maxMorphTargets = 8;
    this.maxMorphNormals = 4;
    var D = this,
      M = !1,
      P = null,
      R = 0,
      O = 0,
      Q = null,
      X = null,
      af = -1;
    var bf = h = null;
    var T = !1;
    var Ua = null,
      jc = null,
      S = new ca,
      Z = new ca,
      da = null,
      L = v.width,
      Y = v.height,
      ha = 1,
      U = new ca(0, 0, L, Y),
      ia = new ca(0, 0, L, Y),
      na = !1,
      Dg = new Sd,
      Ta = new Xj,
      $e = !1,
      qa = !1,
      Xd = new I,
      Mb = new q;
    try {
      x = {
        alpha: x,
        depth: B,
        stencil: C,
        antialias: A,
        premultipliedAlpha: F,
        preserveDrawingBuffer: W,
        powerPreference: Ca,
        failIfMajorPerformanceCaveat: G,
        xrCompatible: !0
      };
      v.addEventListener("webglcontextlost", b, !1);
      v.addEventListener("webglcontextrestored", c, !1);
      var J = w || v.getContext("webgl", x) || v.getContext("experimental-webgl", x);
      if (null === J) {
        if (null !== v.getContext("webgl")) throw Error("Error creating WebGL context with your selected attributes.");
        throw Error("Error creating WebGL context.");
      }
      void 0 === J.getShaderPrecisionFormat && (J.getShaderPrecisionFormat = function() {
        return {
          rangeMin: 1,
          rangeMax: 1,
          precision: 1
        }
      })
    } catch (Bi) {
      throw console.error("THREE.WebGLRenderer: " + Bi.message), Bi;
    }
    var ta, Ea, ba, fa, aa, ea, ka, va, ra, pa, wa, ua, ma, xa, ya, Aa, la;
    a();
    var ja = "undefined" !== typeof navigator && "xr" in navigator && "isSessionSupported" in navigator.xr ? new Ai(D, J) : new Gg(D);
    this.vr = ja;
    var sa = new hl(D, J),
      Da = new ui(D, ra, Ea.maxTextureSize);
    this.shadowMap = Da;
    this.getContext = function() {
      return J
    };
    this.getContextAttributes = function() {
      return J.getContextAttributes()
    };
    this.forceContextLoss = function() {
      var a = ta.get("WEBGL_lose_context");
      a && a.loseContext()
    };
    this.forceContextRestore = function() {
      var a = ta.get("WEBGL_lose_context");
      a && a.restoreContext()
    };
    this.getPixelRatio = function() {
      return ha
    };
    this.setPixelRatio = function(a) {
      void 0 !== a && (ha = a, this.setSize(L, Y, !1))
    };
    this.getSize = function(a) {
      void 0 === a && (console.warn("WebGLRenderer: .getsize() now requires a Vector2 as an argument"), a = new z);
      return a.set(L, Y)
    };
    this.setSize = function(a, b, c) {
      ja.isPresenting() ? console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting.") :
        (L = a, Y = b, v.width = Math.floor(a * ha), v.height = Math.floor(b * ha), !1 !== c && (v.style.width = a + "px", v.style.height = b + "px"), this.setViewport(0, 0, a, b))
    };
    this.getDrawingBufferSize = function(a) {
      void 0 === a && (console.warn("WebGLRenderer: .getdrawingBufferSize() now requires a Vector2 as an argument"), a = new z);
      return a.set(L * ha, Y * ha).floor()
    };
    this.setDrawingBufferSize = function(a, b, c) {
      L = a;
      Y = b;
      ha = c;
      v.width = Math.floor(a * c);
      v.height = Math.floor(b * c);
      this.setViewport(0, 0, a, b)
    };
    this.getCurrentViewport = function(a) {
      void 0 ===
        a && (console.warn("WebGLRenderer: .getCurrentViewport() now requires a Vector4 as an argument"), a = new ca);
      return a.copy(S)
    };
    this.getViewport = function(a) {
      return a.copy(U)
    };
    this.setViewport = function(a, b, c, d) {
      a.isVector4 ? U.set(a.x, a.y, a.z, a.w) : U.set(a, b, c, d);
      ba.viewport(S.copy(U).multiplyScalar(ha).floor())
    };
    this.getScissor = function(a) {
      return a.copy(ia)
    };
    this.setScissor = function(a, b, c, d) {
      a.isVector4 ? ia.set(a.x, a.y, a.z, a.w) : ia.set(a, b, c, d);
      ba.scissor(Z.copy(ia).multiplyScalar(ha).floor())
    };
    this.getScissorTest =
      function() {
        return na
      };
    this.setScissorTest = function(a) {
      ba.setScissorTest(na = a)
    };
    this.getClearColor = function() {
      return ma.getClearColor()
    };
    this.setClearColor = function() {
      ma.setClearColor.apply(ma, arguments)
    };
    this.getClearAlpha = function() {
      return ma.getClearAlpha()
    };
    this.setClearAlpha = function() {
      ma.setClearAlpha.apply(ma, arguments)
    };
    this.clear = function(a, b, c) {
      var d = 0;
      if (void 0 === a || a) d |= 16384;
      if (void 0 === b || b) d |= 256;
      if (void 0 === c || c) d |= 1024;
      J.clear(d)
    };
    this.clearColor = function() {
      this.clear(!0, !1, !1)
    };
    this.clearDepth =
      function() {
        this.clear(!1, !0, !1)
      };
    this.clearStencil = function() {
      this.clear(!1, !1, !0)
    };
    this.dispose = function() {
      v.removeEventListener("webglcontextlost", b, !1);
      v.removeEventListener("webglcontextrestored", c, !1);
      wa.dispose();
      ua.dispose();
      aa.dispose();
      ra.dispose();
      ja.dispose();
      za.stop()
    };
    this.renderBufferImmediate = function(a, b) {
      ba.initAttributes();
      var c = aa.get(a);
      a.hasPositions && !c.position && (c.position = J.createBuffer());
      a.hasNormals && !c.normal && (c.normal = J.createBuffer());
      a.hasUvs && !c.uv && (c.uv = J.createBuffer());
      a.hasColors && !c.color && (c.color = J.createBuffer());
      b = b.getAttributes();
      a.hasPositions && (J.bindBuffer(34962, c.position), J.bufferData(34962, a.positionArray, 35048), ba.enableAttribute(b.position), J.vertexAttribPointer(b.position, 3, 5126, !1, 0, 0));
      a.hasNormals && (J.bindBuffer(34962, c.normal), J.bufferData(34962, a.normalArray, 35048), ba.enableAttribute(b.normal), J.vertexAttribPointer(b.normal, 3, 5126, !1, 0, 0));
      a.hasUvs && (J.bindBuffer(34962, c.uv), J.bufferData(34962, a.uvArray, 35048), ba.enableAttribute(b.uv), J.vertexAttribPointer(b.uv,
        2, 5126, !1, 0, 0));
      a.hasColors && (J.bindBuffer(34962, c.color), J.bufferData(34962, a.colorArray, 35048), ba.enableAttribute(b.color), J.vertexAttribPointer(b.color, 3, 5126, !1, 0, 0));
      ba.disableUnusedAttributes();
      J.drawArrays(4, 0, a.count);
      a.count = 0
    };
    this.renderBufferDirect = function(a, b, c, d, e, f) {
      var g = e.isMesh && 0 > e.matrixWorld.determinant();
      ba.setMaterial(d, g);
      var k = y(a, b, d, e),
        m = !1;
      if (h !== c.id || bf !== k.id || T !== (!0 === d.wireframe)) h = c.id, bf = k.id, T = !0 === d.wireframe, m = !0;
      e.morphTargetInfluences && (xa.update(e, c, d, k),
        m = !0);
      g = c.index;
      var n = c.attributes.position;
      b = 1;
      !0 === d.wireframe && (g = va.getWireframeAttribute(c), b = 2);
      a = ya;
      if (null !== g) {
        var p = ka.get(g);
        a = Aa;
        a.setIndex(p)
      }
      if (m) {
        if (!1 !== Ea.isWebGL2 || !e.isInstancedMesh && !c.isInstancedBufferGeometry || null !== ta.get("ANGLE_instanced_arrays")) {
          ba.initAttributes();
          m = c.attributes;
          k = k.getAttributes();
          var l = d.defaultAttributeValues;
          for (A in k) {
            var r = k[A];
            if (0 <= r) {
              var t = m[A];
              if (void 0 !== t) {
                var u = t.normalized,
                  q = t.itemSize,
                  v = ka.get(t);
                if (void 0 !== v) {
                  var x = v.buffer,
                    w = v.type;
                  v =
                    v.bytesPerElement;
                  if (t.isInterleavedBufferAttribute) {
                    var B = t.data,
                      C = B.stride;
                    t = t.offset;
                    B && B.isInstancedInterleavedBuffer ? (ba.enableAttributeAndDivisor(r, B.meshPerAttribute), void 0 === c.maxInstancedCount && (c.maxInstancedCount = B.meshPerAttribute * B.count)) : ba.enableAttribute(r);
                    J.bindBuffer(34962, x);
                    J.vertexAttribPointer(r, q, w, u, C * v, t * v)
                  } else t.isInstancedBufferAttribute ? (ba.enableAttributeAndDivisor(r, t.meshPerAttribute), void 0 === c.maxInstancedCount && (c.maxInstancedCount = t.meshPerAttribute * t.count)) :
                    ba.enableAttribute(r), J.bindBuffer(34962, x), J.vertexAttribPointer(r, q, w, u, 0, 0)
                }
              } else if ("instanceMatrix" === A) v = ka.get(e.instanceMatrix), void 0 !== v && (x = v.buffer, w = v.type, ba.enableAttributeAndDivisor(r + 0, 1), ba.enableAttributeAndDivisor(r + 1, 1), ba.enableAttributeAndDivisor(r + 2, 1), ba.enableAttributeAndDivisor(r + 3, 1), J.bindBuffer(34962, x), J.vertexAttribPointer(r + 0, 4, w, !1, 64, 0), J.vertexAttribPointer(r + 1, 4, w, !1, 64, 16), J.vertexAttribPointer(r + 2, 4, w, !1, 64, 32), J.vertexAttribPointer(r + 3, 4, w, !1, 64, 48));
              else if (void 0 !==
                l && (u = l[A], void 0 !== u)) switch (u.length) {
                case 2:
                  J.vertexAttrib2fv(r, u);
                  break;
                case 3:
                  J.vertexAttrib3fv(r, u);
                  break;
                case 4:
                  J.vertexAttrib4fv(r, u);
                  break;
                default:
                  J.vertexAttrib1fv(r, u)
              }
            }
          }
          ba.disableUnusedAttributes()
        }
        null !== g && J.bindBuffer(34963, p.buffer)
      }
      p = Infinity;
      null !== g ? p = g.count : void 0 !== n && (p = n.count);
      g = c.drawRange.start * b;
      n = null !== f ? f.start * b : 0;
      var A = Math.max(g, n);
      f = Math.max(0, Math.min(p, g + c.drawRange.count * b, n + (null !== f ? f.count * b : Infinity)) - 1 - A + 1);
      if (0 !== f) {
        if (e.isMesh)
          if (!0 === d.wireframe) ba.setLineWidth(d.wireframeLinewidth *
            (null === Q ? ha : 1)), a.setMode(1);
          else switch (e.drawMode) {
            case 0:
              a.setMode(4);
              break;
            case 1:
              a.setMode(5);
              break;
            case 2:
              a.setMode(6)
          } else e.isLine ? (d = d.linewidth, void 0 === d && (d = 1), ba.setLineWidth(d * (null === Q ? ha : 1)), e.isLineSegments ? a.setMode(1) : e.isLineLoop ? a.setMode(2) : a.setMode(3)) : e.isPoints ? a.setMode(0) : e.isSprite && a.setMode(4);
        e.isInstancedMesh ? a.renderInstances(c, A, f, e.count) : c.isInstancedBufferGeometry ? a.renderInstances(c, A, f, c.maxInstancedCount) : a.render(A, f)
      }
    };
    this.compile = function(a, b) {
      E = ua.get(a,
        b);
      E.init();
      a.traverse(function(a) {
        a.isLight && (E.pushLight(a), a.castShadow && E.pushShadow(a))
      });
      E.setupLights(b);
      a.traverse(function(b) {
        if (b.material)
          if (Array.isArray(b.material))
            for (var c = 0; c < b.material.length; c++) p(b.material[c], a.fog, b);
          else p(b.material, a.fog, b)
      })
    };
    var Ba = null,
      za = new zg;
    za.setAnimationLoop(function(a) {
      ja.isPresenting() || Ba && Ba(a)
    });
    "undefined" !== typeof kc && za.setContext(kc);
    this.setAnimationLoop = function(a) {
      Ba = a;
      ja.setAnimationLoop(a);
      za.start()
    };
    this.render = function(a, b, c, d) {
      if (void 0 !==
        c) {
        console.warn("THREE.WebGLRenderer.render(): the renderTarget argument has been removed. Use .setRenderTarget() instead.");
        var e = c
      }
      if (void 0 !== d) {
        console.warn("THREE.WebGLRenderer.render(): the forceClear argument has been removed. Use .clear() instead.");
        var f = d
      }
      b && b.isCamera ? M || (bf = h = null, T = !1, af = -1, Ua = null, !0 === a.autoUpdate && a.updateMatrixWorld(), null === b.parent && b.updateMatrixWorld(), ja.enabled && (b = ja.getCamera(b)), E = ua.get(a, b), E.init(), a.onBeforeRender(D, a, b, e || Q), Xd.multiplyMatrices(b.projectionMatrix,
        b.matrixWorldInverse), Dg.setFromMatrix(Xd), qa = this.localClippingEnabled, $e = Ta.init(this.clippingPlanes, qa, b), H = wa.get(a, b), H.init(), k(a, b, 0, D.sortObjects), !0 === D.sortObjects && H.sort(), $e && Ta.beginShadows(), Da.render(E.state.shadowsArray, a, b), E.setupLights(b), $e && Ta.endShadows(), this.info.autoReset && this.info.reset(), void 0 !== e && this.setRenderTarget(e), ja.enabled && sa.isAvailable() && sa.attachCamera(b), ma.render(H, a, b, f), c = H.opaque, d = H.transparent, a.overrideMaterial ? (e = a.overrideMaterial, c.length && m(c,
        a, b, e), d.length && m(d, a, b, e)) : (c.length && m(c, a, b), d.length && m(d, a, b)), a.onAfterRender(D, a, b), null !== Q && (ea.updateRenderTargetMipmap(Q), ea.updateMultisampleRenderTarget(Q)), ba.buffers.depth.setTest(!0), ba.buffers.depth.setMask(!0), ba.buffers.color.setMask(!0), ba.setPolygonOffset(!1), ja.enabled && (sa.isAvailable() && sa.detachCamera(b), ja.submitFrame()), E = H = null) : console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.")
    };
    this.setFramebuffer = function(a) {
      P !== a && null === Q && J.bindFramebuffer(36160,
        a);
      P = a
    };
    this.getActiveCubeFace = function() {
      return R
    };
    this.getActiveMipmapLevel = function() {
      return O
    };
    this.getRenderTarget = function() {
      return Q
    };
    this.setRenderTarget = function(a, b, c) {
      Q = a;
      R = b;
      O = c;
      a && void 0 === aa.get(a).__webglFramebuffer && ea.setupRenderTarget(a);
      var d = P,
        e = !1;
      a ? (d = aa.get(a).__webglFramebuffer, a.isWebGLRenderTargetCube ? (d = d[b || 0], e = !0) : d = a.isWebGLMultisampleRenderTarget ? aa.get(a).__webglMultisampledFramebuffer : d, S.copy(a.viewport), Z.copy(a.scissor), da = a.scissorTest) : (S.copy(U).multiplyScalar(ha).floor(),
        Z.copy(ia).multiplyScalar(ha).floor(), da = na);
      X !== d && (J.bindFramebuffer(36160, d), X = d);
      ba.viewport(S);
      ba.scissor(Z);
      ba.setScissorTest(da);
      e && (a = aa.get(a.texture), J.framebufferTexture2D(36160, 36064, 34069 + (b || 0), a.__webglTexture, c || 0))
    };
    this.readRenderTargetPixels = function(a, b, c, d, e, f, g) {
      if (a && a.isWebGLRenderTarget) {
        var h = aa.get(a).__webglFramebuffer;
        a.isWebGLRenderTargetCube && void 0 !== g && (h = h[g]);
        if (h) {
          g = !1;
          h !== X && (J.bindFramebuffer(36160, h), g = !0);
          try {
            var k = a.texture,
              m = k.format,
              n = k.type;
            1023 !== m && la.convert(m) !==
              J.getParameter(35739) ? console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.") : 1009 === n || la.convert(n) === J.getParameter(35738) || 1015 === n && (Ea.isWebGL2 || ta.get("OES_texture_float") || ta.get("WEBGL_color_buffer_float")) || 1016 === n && (Ea.isWebGL2 ? ta.get("EXT_color_buffer_float") : ta.get("EXT_color_buffer_half_float")) ? 36053 === J.checkFramebufferStatus(36160) ? 0 <= b && b <= a.width - d && 0 <= c && c <= a.height - e && J.readPixels(b, c, d, e, la.convert(m), la.convert(n),
                f) : console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.") : console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")
          } finally {
            g && J.bindFramebuffer(36160, X)
          }
        }
      } else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")
    };
    this.copyFramebufferToTexture = function(a, b, c) {
      void 0 === c && (c = 0);
      var d = Math.pow(2, -c),
        e = Math.floor(b.image.width *
          d);
      d = Math.floor(b.image.height * d);
      var f = la.convert(b.format);
      ea.setTexture2D(b, 0);
      J.copyTexImage2D(3553, c, f, a.x, a.y, e, d, 0);
      ba.unbindTexture()
    };
    this.copyTextureToTexture = function(a, b, c, d) {
      var e = b.image.width,
        f = b.image.height,
        g = la.convert(c.format),
        h = la.convert(c.type);
      ea.setTexture2D(c, 0);
      b.isDataTexture ? J.texSubImage2D(3553, d || 0, a.x, a.y, e, f, g, h, b.image.data) : J.texSubImage2D(3553, d || 0, a.x, a.y, g, h, b.image);
      ba.unbindTexture()
    };
    this.initTexture = function(a) {
      ea.setTexture2D(a, 0);
      ba.unbindTexture()
    };
    "undefined" !==
    typeof __THREE_DEVTOOLS__ && __THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe", {
      detail: this
    }))
  }

  function cf(e, h) {
    this.name = "";
    this.color = new D(e);
    this.density = void 0 !== h ? h : 2.5E-4
  }

  function df(e, h, a) {
    this.name = "";
    this.color = new D(e);
    this.near = void 0 !== h ? h : 1;
    this.far = void 0 !== a ? a : 1E3
  }

  function wb(e, h) {
    this.array = e;
    this.stride = h;
    this.count = void 0 !== e ? e.length / h : 0;
    this.usage = 35044;
    this.updateRange = {
      offset: 0,
      count: -1
    };
    this.version = 0
  }

  function Zd(e, h, a, b) {
    this.data = e;
    this.itemSize = h;
    this.offset = a;
    this.normalized = !0 === b
  }

  function Nb(e) {
    R.call(this);
    this.type = "SpriteMaterial";
    this.color = new D(16777215);
    this.alphaMap = this.map = null;
    this.rotation = 0;
    this.transparent = this.sizeAttenuation = !0;
    this.setValues(e)
  }

  function $d(e) {
    E.call(this);
    this.type = "Sprite";
    if (void 0 === Wc) {
      Wc = new G;
      var h = new Float32Array([-.5, -.5, 0, 0, 0, .5, -.5, 0, 1, 0, .5, .5, 0, 1, 1, -.5, .5, 0, 0, 1]);
      h = new wb(h, 5);
      Wc.setIndex([0, 1, 2, 0, 2, 3]);
      Wc.setAttribute("position", new Zd(h, 3, 0, !1));
      Wc.setAttribute("uv", new Zd(h, 2, 3, !1))
    }
    this.geometry = Wc;
    this.material = void 0 !==
      e ? e : new Nb;
    this.center = new z(.5, .5)
  }

  function ef(e, h, a, b, c, d) {
    Xc.subVectors(e, a).addScalar(.5).multiply(b);
    void 0 !== c ? (ae.x = d * Xc.x - c * Xc.y, ae.y = c * Xc.x + d * Xc.y) : ae.copy(Xc);
    e.copy(h);
    e.x += ae.x;
    e.y += ae.y;
    e.applyMatrix4(Ci)
  }

  function be() {
    E.call(this);
    this.type = "LOD";
    Object.defineProperties(this, {
      levels: {
        enumerable: !0,
        value: []
      }
    });
    this.autoUpdate = !0
  }

  function ce(e, h) {
    e && e.isGeometry && console.error("THREE.SkinnedMesh no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");
    ia.call(this, e, h);
    this.type =
      "SkinnedMesh";
    this.bindMode = "attached";
    this.bindMatrix = new I;
    this.bindMatrixInverse = new I
  }

  function ff(e, h) {
    e = e || [];
    this.bones = e.slice(0);
    this.boneMatrices = new Float32Array(16 * this.bones.length);
    this.frame = -1;
    if (void 0 === h) this.calculateInverses();
    else if (this.bones.length === h.length) this.boneInverses = h.slice(0);
    else
      for (console.warn("THREE.Skeleton boneInverses is the wrong length."), this.boneInverses = [], e = 0, h = this.bones.length; e < h; e++) this.boneInverses.push(new I)
  }

  function Ig() {
    E.call(this);
    this.type =
      "Bone"
  }

  function gf(e, h, a) {
    ia.call(this, e, h);
    this.instanceMatrix = new O(new Float32Array(16 * a), 16);
    this.count = a
  }

  function T(e) {
    R.call(this);
    this.type = "LineBasicMaterial";
    this.color = new D(16777215);
    this.linewidth = 1;
    this.linejoin = this.linecap = "round";
    this.setValues(e)
  }

  function pa(e, h, a) {
    1 === a && console.error("THREE.Line: parameter THREE.LinePieces no longer supported. Use THREE.LineSegments instead.");
    E.call(this);
    this.type = "Line";
    this.geometry = void 0 !== e ? e : new G;
    this.material = void 0 !== h ? h : new T({
      color: 16777215 *
        Math.random()
    })
  }

  function Z(e, h) {
    pa.call(this, e, h);
    this.type = "LineSegments"
  }

  function hf(e, h) {
    pa.call(this, e, h);
    this.type = "LineLoop"
  }

  function Va(e) {
    R.call(this);
    this.type = "PointsMaterial";
    this.color = new D(16777215);
    this.alphaMap = this.map = null;
    this.size = 1;
    this.sizeAttenuation = !0;
    this.morphTargets = !1;
    this.setValues(e)
  }

  function Yc(e, h) {
    E.call(this);
    this.type = "Points";
    this.geometry = void 0 !== e ? e : new G;
    this.material = void 0 !== h ? h : new Va({
      color: 16777215 * Math.random()
    });
    this.updateMorphTargets()
  }

  function Jg(e,
    h, a, b, c, d, f) {
    var g = Kg.distanceSqToPoint(e);
    g < a && (a = new q, Kg.closestPointToPoint(e, a), a.applyMatrix4(b), e = c.ray.origin.distanceTo(a), e < c.near || e > c.far || d.push({
      distance: e,
      distanceToRay: Math.sqrt(g),
      point: a,
      index: h,
      face: null,
      object: f
    }))
  }

  function Lg(e, h, a, b, c, d, f, g, k) {
    S.call(this, e, h, a, b, c, d, f, g, k);
    this.format = void 0 !== f ? f : 1022;
    this.minFilter = void 0 !== d ? d : 1006;
    this.magFilter = void 0 !== c ? c : 1006;
    this.generateMipmaps = !1
  }

  function Zc(e, h, a, b, c, d, f, g, k, m, n, p) {
    S.call(this, null, d, f, g, k, m, b, c, n, p);
    this.image = {
      width: h,
      height: a
    };
    this.mipmaps = e;
    this.generateMipmaps = this.flipY = !1
  }

  function de(e, h, a, b, c, d, f, g, k) {
    S.call(this, e, h, a, b, c, d, f, g, k);
    this.needsUpdate = !0
  }

  function ee(e, h, a, b, c, d, f, g, k, m) {
    m = void 0 !== m ? m : 1026;
    if (1026 !== m && 1027 !== m) throw Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");
    void 0 === a && 1026 === m && (a = 1012);
    void 0 === a && 1027 === m && (a = 1020);
    S.call(this, null, b, c, d, f, g, m, a, k);
    this.image = {
      width: e,
      height: h
    };
    this.magFilter = void 0 !== f ? f : 1003;
    this.minFilter = void 0 !==
      g ? g : 1003;
    this.generateMipmaps = this.flipY = !1
  }

  function $c(e) {
    G.call(this);
    this.type = "WireframeGeometry";
    var h = [],
      a, b, c, d = [0, 0],
      f = {},
      g = ["a", "b", "c"];
    if (e && e.isGeometry) {
      var k = e.faces;
      var m = 0;
      for (b = k.length; m < b; m++) {
        var n = k[m];
        for (a = 0; 3 > a; a++) {
          var p = n[g[a]];
          var l = n[g[(a + 1) % 3]];
          d[0] = Math.min(p, l);
          d[1] = Math.max(p, l);
          p = d[0] + "," + d[1];
          void 0 === f[p] && (f[p] = {
            index1: d[0],
            index2: d[1]
          })
        }
      }
      for (p in f) m = f[p], g = e.vertices[m.index1], h.push(g.x, g.y, g.z), g = e.vertices[m.index2], h.push(g.x, g.y, g.z)
    } else if (e && e.isBufferGeometry)
      if (g =
        new q, null !== e.index) {
        k = e.attributes.position;
        n = e.index;
        var t = e.groups;
        0 === t.length && (t = [{
          start: 0,
          count: n.count,
          materialIndex: 0
        }]);
        e = 0;
        for (c = t.length; e < c; ++e)
          for (m = t[e], a = m.start, b = m.count, m = a, b = a + b; m < b; m += 3)
            for (a = 0; 3 > a; a++) p = n.getX(m + a), l = n.getX(m + (a + 1) % 3), d[0] = Math.min(p, l), d[1] = Math.max(p, l), p = d[0] + "," + d[1], void 0 === f[p] && (f[p] = {
              index1: d[0],
              index2: d[1]
            });
        for (p in f) m = f[p], g.fromBufferAttribute(k, m.index1), h.push(g.x, g.y, g.z), g.fromBufferAttribute(k, m.index2), h.push(g.x, g.y, g.z)
      } else
        for (k = e.attributes.position,
          m = 0, b = k.count / 3; m < b; m++)
          for (a = 0; 3 > a; a++) f = 3 * m + a, g.fromBufferAttribute(k, f), h.push(g.x, g.y, g.z), f = 3 * m + (a + 1) % 3, g.fromBufferAttribute(k, f), h.push(g.x, g.y, g.z);
    this.setAttribute("position", new F(h, 3))
  }

  function fe(e, h, a) {
    P.call(this);
    this.type = "ParametricGeometry";
    this.parameters = {
      func: e,
      slices: h,
      stacks: a
    };
    this.fromBufferGeometry(new ad(e, h, a));
    this.mergeVertices()
  }

  function ad(e, h, a) {
    G.call(this);
    this.type = "ParametricBufferGeometry";
    this.parameters = {
      func: e,
      slices: h,
      stacks: a
    };
    var b = [],
      c = [],
      d = [],
      f = [],
      g =
      new q,
      k = new q,
      m = new q,
      n = new q,
      p = new q,
      l, t;
    3 > e.length && console.error("THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.");
    var r = h + 1;
    for (l = 0; l <= a; l++) {
      var u = l / a;
      for (t = 0; t <= h; t++) {
        var v = t / h;
        e(v, u, k);
        c.push(k.x, k.y, k.z);
        0 <= v - 1E-5 ? (e(v - 1E-5, u, m), n.subVectors(k, m)) : (e(v + 1E-5, u, m), n.subVectors(m, k));
        0 <= u - 1E-5 ? (e(v, u - 1E-5, m), p.subVectors(k, m)) : (e(v, u + 1E-5, m), p.subVectors(m, k));
        g.crossVectors(n, p).normalize();
        d.push(g.x, g.y, g.z);
        f.push(v, u)
      }
    }
    for (l = 0; l < a; l++)
      for (t = 0; t < h; t++) e =
        l * r + t + 1, g = (l + 1) * r + t + 1, k = (l + 1) * r + t, b.push(l * r + t, e, k), b.push(e, g, k);
    this.setIndex(b);
    this.setAttribute("position", new F(c, 3));
    this.setAttribute("normal", new F(d, 3));
    this.setAttribute("uv", new F(f, 2))
  }

  function ge(e, h, a, b) {
    P.call(this);
    this.type = "PolyhedronGeometry";
    this.parameters = {
      vertices: e,
      indices: h,
      radius: a,
      detail: b
    };
    this.fromBufferGeometry(new Fa(e, h, a, b));
    this.mergeVertices()
  }

  function Fa(e, h, a, b) {
    function c(a) {
      g.push(a.x, a.y, a.z)
    }

    function d(a, b) {
      a *= 3;
      b.x = e[a + 0];
      b.y = e[a + 1];
      b.z = e[a + 2]
    }

    function f(a,
      b, c, d) {
      0 > d && 1 === a.x && (k[b] = a.x - 1);
      0 === c.x && 0 === c.z && (k[b] = d / 2 / Math.PI + .5)
    }
    G.call(this);
    this.type = "PolyhedronBufferGeometry";
    this.parameters = {
      vertices: e,
      indices: h,
      radius: a,
      detail: b
    };
    a = a || 1;
    b = b || 0;
    var g = [],
      k = [];
    (function(a) {
      for (var b = new q, e = new q, f = new q, g = 0; g < h.length; g += 3) {
        d(h[g + 0], b);
        d(h[g + 1], e);
        d(h[g + 2], f);
        var k, m, l = b,
          w = e,
          x = f,
          B = Math.pow(2, a),
          C = [];
        for (m = 0; m <= B; m++) {
          C[m] = [];
          var A = l.clone().lerp(x, m / B),
            z = w.clone().lerp(x, m / B),
            W = B - m;
          for (k = 0; k <= W; k++) C[m][k] = 0 === k && m === B ? A : A.clone().lerp(z, k / W)
        }
        for (m =
          0; m < B; m++)
          for (k = 0; k < 2 * (B - m) - 1; k++) l = Math.floor(k / 2), 0 === k % 2 ? (c(C[m][l + 1]), c(C[m + 1][l]), c(C[m][l])) : (c(C[m][l + 1]), c(C[m + 1][l + 1]), c(C[m + 1][l]))
      }
    })(b);
    (function(a) {
      for (var b = new q, c = 0; c < g.length; c += 3) b.x = g[c + 0], b.y = g[c + 1], b.z = g[c + 2], b.normalize().multiplyScalar(a), g[c + 0] = b.x, g[c + 1] = b.y, g[c + 2] = b.z
    })(a);
    (function() {
      for (var a = new q, b = 0; b < g.length; b += 3) a.x = g[b + 0], a.y = g[b + 1], a.z = g[b + 2], k.push(Math.atan2(a.z, -a.x) / 2 / Math.PI + .5, 1 - (Math.atan2(-a.y, Math.sqrt(a.x * a.x + a.z * a.z)) / Math.PI + .5));
      a = new q;
      b = new q;
      for (var c =
          new q, d = new q, e = new z, h = new z, l = new z, v = 0, w = 0; v < g.length; v += 9, w += 6) {
        a.set(g[v + 0], g[v + 1], g[v + 2]);
        b.set(g[v + 3], g[v + 4], g[v + 5]);
        c.set(g[v + 6], g[v + 7], g[v + 8]);
        e.set(k[w + 0], k[w + 1]);
        h.set(k[w + 2], k[w + 3]);
        l.set(k[w + 4], k[w + 5]);
        d.copy(a).add(b).add(c).divideScalar(3);
        var x = Math.atan2(d.z, -d.x);
        f(e, w + 0, a, x);
        f(h, w + 2, b, x);
        f(l, w + 4, c, x)
      }
      for (a = 0; a < k.length; a += 6) b = k[a + 0], c = k[a + 2], d = k[a + 4], e = Math.min(b, c, d), .9 < Math.max(b, c, d) && .1 > e && (.2 > b && (k[a + 0] += 1), .2 > c && (k[a + 2] += 1), .2 > d && (k[a + 4] += 1))
    })();
    this.setAttribute("position",
      new F(g, 3));
    this.setAttribute("normal", new F(g.slice(), 3));
    this.setAttribute("uv", new F(k, 2));
    0 === b ? this.computeVertexNormals() : this.normalizeNormals()
  }

  function he(e, h) {
    P.call(this);
    this.type = "TetrahedronGeometry";
    this.parameters = {
      radius: e,
      detail: h
    };
    this.fromBufferGeometry(new bd(e, h));
    this.mergeVertices()
  }

  function bd(e, h) {
    Fa.call(this, [1, 1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -1], [2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1], e, h);
    this.type = "TetrahedronBufferGeometry";
    this.parameters = {
      radius: e,
      detail: h
    }
  }

  function ie(e, h) {
    P.call(this);
    this.type = "OctahedronGeometry";
    this.parameters = {
      radius: e,
      detail: h
    };
    this.fromBufferGeometry(new lc(e, h));
    this.mergeVertices()
  }

  function lc(e, h) {
    Fa.call(this, [1, 0, 0, -1, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 1, 0, 0, -1], [0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2], e, h);
    this.type = "OctahedronBufferGeometry";
    this.parameters = {
      radius: e,
      detail: h
    }
  }

  function je(e, h) {
    P.call(this);
    this.type = "IcosahedronGeometry";
    this.parameters = {
      radius: e,
      detail: h
    };
    this.fromBufferGeometry(new cd(e, h));
    this.mergeVertices()
  }

  function cd(e, h) {
    var a =
      (1 + Math.sqrt(5)) / 2;
    Fa.call(this, [-1, a, 0, 1, a, 0, -1, -a, 0, 1, -a, 0, 0, -1, a, 0, 1, a, 0, -1, -a, 0, 1, -a, a, 0, -1, a, 0, 1, -a, 0, -1, -a, 0, 1], [0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11, 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8, 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9, 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1], e, h);
    this.type = "IcosahedronBufferGeometry";
    this.parameters = {
      radius: e,
      detail: h
    }
  }

  function ke(e, h) {
    P.call(this);
    this.type = "DodecahedronGeometry";
    this.parameters = {
      radius: e,
      detail: h
    };
    this.fromBufferGeometry(new dd(e, h));
    this.mergeVertices()
  }

  function dd(e, h) {
    var a =
      (1 + Math.sqrt(5)) / 2,
      b = 1 / a;
    Fa.call(this, [-1, -1, -1, -1, -1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, -1, 1, 1, 1, 0, -b, -a, 0, -b, a, 0, b, -a, 0, b, a, -b, -a, 0, -b, a, 0, b, -a, 0, b, a, 0, -a, 0, -b, a, 0, -b, -a, 0, b, a, 0, b], [3, 11, 7, 3, 7, 15, 3, 15, 13, 7, 19, 17, 7, 17, 6, 7, 6, 15, 17, 4, 8, 17, 8, 10, 17, 10, 6, 8, 0, 16, 8, 16, 2, 8, 2, 10, 0, 12, 1, 0, 1, 18, 0, 18, 16, 6, 10, 2, 6, 2, 13, 6, 13, 15, 2, 16, 18, 2, 18, 3, 2, 3, 13, 18, 1, 9, 18, 9, 11, 18, 11, 3, 4, 14, 12, 4, 12, 0, 4, 0, 8, 11, 9, 5, 11, 5, 19, 11, 19, 7, 19, 5, 14, 19, 14, 4, 19, 4, 17, 1, 12, 14, 1, 14, 5, 1, 5, 9], e, h);
    this.type = "DodecahedronBufferGeometry";
    this.parameters = {
      radius: e,
      detail: h
    }
  }

  function le(e, h, a, b, c, d) {
    P.call(this);
    this.type = "TubeGeometry";
    this.parameters = {
      path: e,
      tubularSegments: h,
      radius: a,
      radialSegments: b,
      closed: c
    };
    void 0 !== d && console.warn("THREE.TubeGeometry: taper has been removed.");
    e = new mc(e, h, a, b, c);
    this.tangents = e.tangents;
    this.normals = e.normals;
    this.binormals = e.binormals;
    this.fromBufferGeometry(e);
    this.mergeVertices()
  }

  function mc(e, h, a, b, c) {
    function d(c) {
      n = e.getPointAt(c / h, n);
      var d = f.normals[c];
      c = f.binormals[c];
      for (l = 0; l <= b; l++) {
        var m = l / b * Math.PI *
          2,
          p = Math.sin(m);
        m = -Math.cos(m);
        k.x = m * d.x + p * c.x;
        k.y = m * d.y + p * c.y;
        k.z = m * d.z + p * c.z;
        k.normalize();
        r.push(k.x, k.y, k.z);
        g.x = n.x + a * k.x;
        g.y = n.y + a * k.y;
        g.z = n.z + a * k.z;
        t.push(g.x, g.y, g.z)
      }
    }
    G.call(this);
    this.type = "TubeBufferGeometry";
    this.parameters = {
      path: e,
      tubularSegments: h,
      radius: a,
      radialSegments: b,
      closed: c
    };
    h = h || 64;
    a = a || 1;
    b = b || 8;
    c = c || !1;
    var f = e.computeFrenetFrames(h, c);
    this.tangents = f.tangents;
    this.normals = f.normals;
    this.binormals = f.binormals;
    var g = new q,
      k = new q,
      m = new z,
      n = new q,
      p, l, t = [],
      r = [],
      u = [],
      v = [];
    for (p =
      0; p < h; p++) d(p);
    d(!1 === c ? h : 0);
    for (p = 0; p <= h; p++)
      for (l = 0; l <= b; l++) m.x = p / h, m.y = l / b, u.push(m.x, m.y);
    (function() {
      for (l = 1; l <= h; l++)
        for (p = 1; p <= b; p++) {
          var a = (b + 1) * l + (p - 1),
            c = (b + 1) * l + p,
            d = (b + 1) * (l - 1) + p;
          v.push((b + 1) * (l - 1) + (p - 1), a, d);
          v.push(a, c, d)
        }
    })();
    this.setIndex(v);
    this.setAttribute("position", new F(t, 3));
    this.setAttribute("normal", new F(r, 3));
    this.setAttribute("uv", new F(u, 2))
  }

  function me(e, h, a, b, c, d, f) {
    P.call(this);
    this.type = "TorusKnotGeometry";
    this.parameters = {
      radius: e,
      tube: h,
      tubularSegments: a,
      radialSegments: b,
      p: c,
      q: d
    };
    void 0 !== f && console.warn("THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.");
    this.fromBufferGeometry(new ed(e, h, a, b, c, d));
    this.mergeVertices()
  }

  function ed(e, h, a, b, c, d) {
    function f(a, b, c, d, e) {
      var f = Math.sin(a);
      b = c / b * a;
      c = Math.cos(b);
      e.x = d * (2 + c) * .5 * Math.cos(a);
      e.y = d * (2 + c) * f * .5;
      e.z = d * Math.sin(b) * .5
    }
    G.call(this);
    this.type = "TorusKnotBufferGeometry";
    this.parameters = {
      radius: e,
      tube: h,
      tubularSegments: a,
      radialSegments: b,
      p: c,
      q: d
    };
    e = e || 1;
    h = h || .4;
    a = Math.floor(a) ||
      64;
    b = Math.floor(b) || 8;
    c = c || 2;
    d = d || 3;
    var g = [],
      k = [],
      m = [],
      n = [],
      p, l = new q,
      t = new q,
      r = new q,
      u = new q,
      v = new q,
      w = new q,
      x = new q;
    for (p = 0; p <= a; ++p) {
      var B = p / a * c * Math.PI * 2;
      f(B, c, d, e, r);
      f(B + .01, c, d, e, u);
      w.subVectors(u, r);
      x.addVectors(u, r);
      v.crossVectors(w, x);
      x.crossVectors(v, w);
      v.normalize();
      x.normalize();
      for (B = 0; B <= b; ++B) {
        var C = B / b * Math.PI * 2,
          A = -h * Math.cos(C);
        C = h * Math.sin(C);
        l.x = r.x + (A * x.x + C * v.x);
        l.y = r.y + (A * x.y + C * v.y);
        l.z = r.z + (A * x.z + C * v.z);
        k.push(l.x, l.y, l.z);
        t.subVectors(l, r).normalize();
        m.push(t.x, t.y, t.z);
        n.push(p /
          a);
        n.push(B / b)
      }
    }
    for (B = 1; B <= a; B++)
      for (p = 1; p <= b; p++) e = (b + 1) * B + (p - 1), h = (b + 1) * B + p, c = (b + 1) * (B - 1) + p, g.push((b + 1) * (B - 1) + (p - 1), e, c), g.push(e, h, c);
    this.setIndex(g);
    this.setAttribute("position", new F(k, 3));
    this.setAttribute("normal", new F(m, 3));
    this.setAttribute("uv", new F(n, 2))
  }

  function ne(e, h, a, b, c) {
    P.call(this);
    this.type = "TorusGeometry";
    this.parameters = {
      radius: e,
      tube: h,
      radialSegments: a,
      tubularSegments: b,
      arc: c
    };
    this.fromBufferGeometry(new fd(e, h, a, b, c));
    this.mergeVertices()
  }

  function fd(e, h, a, b, c) {
    G.call(this);
    this.type = "TorusBufferGeometry";
    this.parameters = {
      radius: e,
      tube: h,
      radialSegments: a,
      tubularSegments: b,
      arc: c
    };
    e = e || 1;
    h = h || .4;
    a = Math.floor(a) || 8;
    b = Math.floor(b) || 6;
    c = c || 2 * Math.PI;
    var d = [],
      f = [],
      g = [],
      k = [],
      m = new q,
      n = new q,
      p = new q,
      l, t;
    for (l = 0; l <= a; l++)
      for (t = 0; t <= b; t++) {
        var r = t / b * c,
          u = l / a * Math.PI * 2;
        n.x = (e + h * Math.cos(u)) * Math.cos(r);
        n.y = (e + h * Math.cos(u)) * Math.sin(r);
        n.z = h * Math.sin(u);
        f.push(n.x, n.y, n.z);
        m.x = e * Math.cos(r);
        m.y = e * Math.sin(r);
        p.subVectors(n, m).normalize();
        g.push(p.x, p.y, p.z);
        k.push(t / b);
        k.push(l /
          a)
      }
    for (l = 1; l <= a; l++)
      for (t = 1; t <= b; t++) e = (b + 1) * (l - 1) + t - 1, h = (b + 1) * (l - 1) + t, c = (b + 1) * l + t, d.push((b + 1) * l + t - 1, e, c), d.push(e, h, c);
    this.setIndex(d);
    this.setAttribute("position", new F(f, 3));
    this.setAttribute("normal", new F(g, 3));
    this.setAttribute("uv", new F(k, 2))
  }

  function Di(e, h, a, b, c) {
    for (var d, f = 0, g = h, k = a - b; g < a; g += b) f += (e[k] - e[g]) * (e[g + 1] + e[k + 1]), k = g;
    if (c === 0 < f)
      for (c = h; c < a; c += b) d = Ei(c, e[c], e[c + 1], d);
    else
      for (c = a - b; c >= h; c -= b) d = Ei(c, e[c], e[c + 1], d);
    d && nc(d, d.next) && (oe(d), d = d.next);
    return d
  }

  function pe(e, h) {
    if (!e) return e;
    h || (h = e);
    do {
      var a = !1;
      if (e.steiner || !nc(e, e.next) && 0 !== wa(e.prev, e, e.next)) e = e.next;
      else {
        oe(e);
        e = h = e.prev;
        if (e === e.next) break;
        a = !0
      }
    } while (a || e !== h);
    return h
  }

  function qe(e, h, a, b, c, d, f) {
    if (e) {
      if (!f && d) {
        var g = e,
          k = g;
        do null === k.z && (k.z = Mg(k.x, k.y, b, c, d)), k.prevZ = k.prev, k = k.nextZ = k.next; while (k !== g);
        k.prevZ.nextZ = null;
        k.prevZ = null;
        g = k;
        var m, n, p, l, t = 1;
        do {
          k = g;
          var r = g = null;
          for (n = 0; k;) {
            n++;
            var u = k;
            for (m = p = 0; m < t && (p++, u = u.nextZ, u); m++);
            for (l = t; 0 < p || 0 < l && u;) 0 !== p && (0 === l || !u || k.z <= u.z) ? (m = k, k = k.nextZ, p--) : (m =
              u, u = u.nextZ, l--), r ? r.nextZ = m : g = m, m.prevZ = r, r = m;
            k = u
          }
          r.nextZ = null;
          t *= 2
        } while (1 < n)
      }
      for (g = e; e.prev !== e.next;) {
        k = e.prev;
        u = e.next;
        if (d) r = il(e, b, c, d);
        else a: if (r = e, n = r.prev, p = r, t = r.next, 0 <= wa(n, p, t)) r = !1;
          else {
            for (m = r.next.next; m !== r.prev;) {
              if (gd(n.x, n.y, p.x, p.y, t.x, t.y, m.x, m.y) && 0 <= wa(m.prev, m, m.next)) {
                r = !1;
                break a
              }
              m = m.next
            }
            r = !0
          } if (r) h.push(k.i / a), h.push(e.i / a), h.push(u.i / a), oe(e), g = e = u.next;
        else if (e = u, e === g) {
          if (!f) qe(pe(e), h, a, b, c, d, 1);
          else if (1 === f) {
            f = h;
            g = a;
            k = e;
            do u = k.prev, r = k.next.next, !nc(u, r) && Fi(u,
              k, k.next, r) && re(u, r) && re(r, u) && (f.push(u.i / g), f.push(k.i / g), f.push(r.i / g), oe(k), oe(k.next), k = e = r), k = k.next; while (k !== e);
            e = k;
            qe(e, h, a, b, c, d, 2)
          } else if (2 === f) a: {
            f = e;do {
              for (g = f.next.next; g !== f.prev;) {
                if (k = f.i !== g.i) {
                  k = f;
                  u = g;
                  if (r = k.next.i !== u.i && k.prev.i !== u.i) {
                    b: {
                      r = k;do {
                        if (r.i !== k.i && r.next.i !== k.i && r.i !== u.i && r.next.i !== u.i && Fi(r, r.next, k, u)) {
                          r = !0;
                          break b
                        }
                        r = r.next
                      } while (r !== k);r = !1
                    }
                    r = !r
                  }
                  if (r = r && re(k, u) && re(u, k)) {
                    r = k;
                    n = !1;
                    p = (k.x + u.x) / 2;
                    u = (k.y + u.y) / 2;
                    do r.y > u !== r.next.y > u && r.next.y !== r.y && p < (r.next.x -
                      r.x) * (u - r.y) / (r.next.y - r.y) + r.x && (n = !n), r = r.next; while (r !== k);
                    r = n
                  }
                  k = r
                }
                if (k) {
                  e = Gi(f, g);
                  f = pe(f, f.next);
                  e = pe(e, e.next);
                  qe(f, h, a, b, c, d);
                  qe(e, h, a, b, c, d);
                  break a
                }
                g = g.next
              }
              f = f.next
            } while (f !== e)
          }
          break
        }
      }
    }
  }

  function il(e, h, a, b) {
    var c = e.prev,
      d = e.next;
    if (0 <= wa(c, e, d)) return !1;
    var f = c.x > e.x ? c.x > d.x ? c.x : d.x : e.x > d.x ? e.x : d.x,
      g = c.y > e.y ? c.y > d.y ? c.y : d.y : e.y > d.y ? e.y : d.y,
      k = Mg(c.x < e.x ? c.x < d.x ? c.x : d.x : e.x < d.x ? e.x : d.x, c.y < e.y ? c.y < d.y ? c.y : d.y : e.y < d.y ? e.y : d.y, h, a, b);
    h = Mg(f, g, h, a, b);
    a = e.prevZ;
    for (b = e.nextZ; a && a.z >= k && b && b.z <=
      h;) {
      if (a !== e.prev && a !== e.next && gd(c.x, c.y, e.x, e.y, d.x, d.y, a.x, a.y) && 0 <= wa(a.prev, a, a.next)) return !1;
      a = a.prevZ;
      if (b !== e.prev && b !== e.next && gd(c.x, c.y, e.x, e.y, d.x, d.y, b.x, b.y) && 0 <= wa(b.prev, b, b.next)) return !1;
      b = b.nextZ
    }
    for (; a && a.z >= k;) {
      if (a !== e.prev && a !== e.next && gd(c.x, c.y, e.x, e.y, d.x, d.y, a.x, a.y) && 0 <= wa(a.prev, a, a.next)) return !1;
      a = a.prevZ
    }
    for (; b && b.z <= h;) {
      if (b !== e.prev && b !== e.next && gd(c.x, c.y, e.x, e.y, d.x, d.y, b.x, b.y) && 0 <= wa(b.prev, b, b.next)) return !1;
      b = b.nextZ
    }
    return !0
  }

  function jl(e, h) {
    return e.x - h.x
  }

  function kl(e, h) {
    var a = h,
      b = e.x,
      c = e.y,
      d = -Infinity;
    do {
      if (c <= a.y && c >= a.next.y && a.next.y !== a.y) {
        var f = a.x + (c - a.y) * (a.next.x - a.x) / (a.next.y - a.y);
        if (f <= b && f > d) {
          d = f;
          if (f === b) {
            if (c === a.y) return a;
            if (c === a.next.y) return a.next
          }
          var g = a.x < a.next.x ? a : a.next
        }
      }
      a = a.next
    } while (a !== h);
    if (!g) return null;
    if (b === d) return g.prev;
    h = g;
    f = g.x;
    var k = g.y,
      m = Infinity;
    for (a = g.next; a !== h;) {
      if (b >= a.x && a.x >= f && b !== a.x && gd(c < k ? b : d, c, f, k, c < k ? d : b, c, a.x, a.y)) {
        var n = Math.abs(c - a.y) / (b - a.x);
        (n < m || n === m && a.x > g.x) && re(a, e) && (g = a, m = n)
      }
      a =
        a.next
    }
    return g
  }

  function Mg(e, h, a, b, c) {
    e = 32767 * (e - a) * c;
    h = 32767 * (h - b) * c;
    e = (e | e << 8) & 16711935;
    e = (e | e << 4) & 252645135;
    e = (e | e << 2) & 858993459;
    h = (h | h << 8) & 16711935;
    h = (h | h << 4) & 252645135;
    h = (h | h << 2) & 858993459;
    return (e | e << 1) & 1431655765 | ((h | h << 1) & 1431655765) << 1
  }

  function ll(e) {
    var h = e,
      a = e;
    do {
      if (h.x < a.x || h.x === a.x && h.y < a.y) a = h;
      h = h.next
    } while (h !== e);
    return a
  }

  function gd(e, h, a, b, c, d, f, g) {
    return 0 <= (c - f) * (h - g) - (e - f) * (d - g) && 0 <= (e - f) * (b - g) - (a - f) * (h - g) && 0 <= (a - f) * (d - g) - (c - f) * (b - g)
  }

  function wa(e, h, a) {
    return (h.y - e.y) * (a.x -
      h.x) - (h.x - e.x) * (a.y - h.y)
  }

  function nc(e, h) {
    return e.x === h.x && e.y === h.y
  }

  function Fi(e, h, a, b) {
    return nc(e, a) && nc(h, b) || nc(e, b) && nc(a, h) ? !0 : 0 < wa(e, h, a) !== 0 < wa(e, h, b) && 0 < wa(a, b, e) !== 0 < wa(a, b, h)
  }

  function re(e, h) {
    return 0 > wa(e.prev, e, e.next) ? 0 <= wa(e, h, e.next) && 0 <= wa(e, e.prev, h) : 0 > wa(e, h, e.prev) || 0 > wa(e, e.next, h)
  }

  function Gi(e, h) {
    var a = new Ng(e.i, e.x, e.y),
      b = new Ng(h.i, h.x, h.y),
      c = e.next,
      d = h.prev;
    e.next = h;
    h.prev = e;
    a.next = c;
    c.prev = a;
    b.next = a;
    a.prev = b;
    d.next = b;
    b.prev = d;
    return b
  }

  function Ei(e, h, a, b) {
    e = new Ng(e,
      h, a);
    b ? (e.next = b.next, e.prev = b, b.next.prev = e, b.next = e) : (e.prev = e, e.next = e);
    return e
  }

  function oe(e) {
    e.next.prev = e.prev;
    e.prev.next = e.next;
    e.prevZ && (e.prevZ.nextZ = e.nextZ);
    e.nextZ && (e.nextZ.prevZ = e.prevZ)
  }

  function Ng(e, h, a) {
    this.i = e;
    this.x = h;
    this.y = a;
    this.nextZ = this.prevZ = this.z = this.next = this.prev = null;
    this.steiner = !1
  }

  function Hi(e) {
    var h = e.length;
    2 < h && e[h - 1].equals(e[0]) && e.pop()
  }

  function Ii(e, h) {
    for (var a = 0; a < h.length; a++) e.push(h[a].x), e.push(h[a].y)
  }

  function oc(e, h) {
    P.call(this);
    this.type = "ExtrudeGeometry";
    this.parameters = {
      shapes: e,
      options: h
    };
    this.fromBufferGeometry(new jb(e, h));
    this.mergeVertices()
  }

  function jb(e, h) {
    function a(a) {
      function e(a, b, c) {
        b || console.error("THREE.ExtrudeGeometry: vec does not exist");
        return b.clone().multiplyScalar(c).add(a)
      }

      function f(a, b, c) {
        var d = a.x - b.x;
        var e = a.y - b.y;
        var f = c.x - a.x;
        var g = c.y - a.y,
          h = d * d + e * e;
        if (Math.abs(d * g - e * f) > Number.EPSILON) {
          var k = Math.sqrt(h),
            m = Math.sqrt(f * f + g * g);
          h = b.x - e / k;
          b = b.y + d / k;
          g = ((c.x - g / m - h) * g - (c.y + f / m - b) * f) / (d * g - e * f);
          f = h + d * g - a.x;
          d = b + e * g - a.y;
          e = f * f +
            d * d;
          if (2 >= e) return new z(f, d);
          e = Math.sqrt(e / 2)
        } else a = !1, d > Number.EPSILON ? f > Number.EPSILON && (a = !0) : d < -Number.EPSILON ? f < -Number.EPSILON && (a = !0) : Math.sign(e) === Math.sign(g) && (a = !0), a ? (f = -e, e = Math.sqrt(h)) : (f = d, d = e, e = Math.sqrt(h / 2));
        return new z(f / e, d / e)
      }

      function g(a, d) {
        for (L = a.length; 0 <= --L;) {
          var e = L;
          var f = L - 1;
          0 > f && (f = a.length - 1);
          var g, h = x + 2 * D;
          for (g = 0; g < h; g++) {
            var k = Z * g,
              m = Z * (g + 1),
              n = d + f + k,
              p = d + f + m;
            m = d + e + m;
            r(d + e + k);
            r(n);
            r(m);
            r(n);
            r(p);
            r(m);
            k = c.length / 3;
            k = H.generateSideWallUV(b, c, k - 6, k - 3, k - 2, k - 1);
            u(k[0]);
            u(k[1]);
            u(k[3]);
            u(k[1]);
            u(k[2]);
            u(k[3])
          }
        }
      }

      function k(a, b, c) {
        v.push(a);
        v.push(b);
        v.push(c)
      }

      function l(a, d, e) {
        r(a);
        r(d);
        r(e);
        a = c.length / 3;
        a = H.generateTopUV(b, c, a - 3, a - 2, a - 1);
        u(a[0]);
        u(a[1]);
        u(a[2])
      }

      function r(a) {
        c.push(v[3 * a]);
        c.push(v[3 * a + 1]);
        c.push(v[3 * a + 2])
      }

      function u(a) {
        d.push(a.x);
        d.push(a.y)
      }
      var v = [],
        w = void 0 !== h.curveSegments ? h.curveSegments : 12,
        x = void 0 !== h.steps ? h.steps : 1,
        B = void 0 !== h.depth ? h.depth : 100,
        C = void 0 !== h.bevelEnabled ? h.bevelEnabled : !0,
        A = void 0 !== h.bevelThickness ? h.bevelThickness : 6,
        E = void 0 !== h.bevelSize ? h.bevelSize : A - 2,
        W = void 0 !== h.bevelOffset ? h.bevelOffset : 0,
        D = void 0 !== h.bevelSegments ? h.bevelSegments : 3,
        F = h.extrudePath,
        H = void 0 !== h.UVGenerator ? h.UVGenerator : ml;
      void 0 !== h.amount && (console.warn("THREE.ExtrudeBufferGeometry: amount has been renamed to depth."), B = h.amount);
      var G = !1;
      if (F) {
        var K = F.getSpacedPoints(x);
        G = !0;
        C = !1;
        var M = F.computeFrenetFrames(x, !1);
        var P = new q;
        var R = new q;
        var O = new q
      }
      C || (W = E = A = D = 0);
      var N;
      w = a.extractPoints(w);
      a = w.shape;
      var Q = w.holes;
      if (!xb.isClockWise(a)) {
        a =
          a.reverse();
        var I = 0;
        for (N = Q.length; I < N; I++) {
          var S = Q[I];
          xb.isClockWise(S) && (Q[I] = S.reverse())
        }
      }
      var aa = xb.triangulateShape(a, Q),
        X = a;
      I = 0;
      for (N = Q.length; I < N; I++) S = Q[I], a = a.concat(S);
      var T, Z = a.length,
        V, ea = aa.length;
      w = [];
      var L = 0;
      var Y = X.length;
      var ha = Y - 1;
      for (T = L + 1; L < Y; L++, ha++, T++) ha === Y && (ha = 0), T === Y && (T = 0), w[L] = f(X[L], X[ha], X[T]);
      F = [];
      var fa = w.concat();
      I = 0;
      for (N = Q.length; I < N; I++) {
        S = Q[I];
        var ca = [];
        L = 0;
        Y = S.length;
        ha = Y - 1;
        for (T = L + 1; L < Y; L++, ha++, T++) ha === Y && (ha = 0), T === Y && (T = 0), ca[L] = f(S[L], S[ha], S[T]);
        F.push(ca);
        fa = fa.concat(ca)
      }
      for (ha = 0; ha < D; ha++) {
        Y = ha / D;
        var da = A * Math.cos(Y * Math.PI / 2);
        T = E * Math.sin(Y * Math.PI / 2) + W;
        L = 0;
        for (Y = X.length; L < Y; L++) {
          var U = e(X[L], w[L], T);
          k(U.x, U.y, -da)
        }
        I = 0;
        for (N = Q.length; I < N; I++)
          for (S = Q[I], ca = F[I], L = 0, Y = S.length; L < Y; L++) U = e(S[L], ca[L], T), k(U.x, U.y, -da)
      }
      T = E + W;
      for (L = 0; L < Z; L++) U = C ? e(a[L], fa[L], T) : a[L], G ? (R.copy(M.normals[0]).multiplyScalar(U.x), P.copy(M.binormals[0]).multiplyScalar(U.y), O.copy(K[0]).add(R).add(P), k(O.x, O.y, O.z)) : k(U.x, U.y, 0);
      for (Y = 1; Y <= x; Y++)
        for (L = 0; L < Z; L++) U = C ? e(a[L],
          fa[L], T) : a[L], G ? (R.copy(M.normals[Y]).multiplyScalar(U.x), P.copy(M.binormals[Y]).multiplyScalar(U.y), O.copy(K[Y]).add(R).add(P), k(O.x, O.y, O.z)) : k(U.x, U.y, B / x * Y);
      for (ha = D - 1; 0 <= ha; ha--) {
        Y = ha / D;
        da = A * Math.cos(Y * Math.PI / 2);
        T = E * Math.sin(Y * Math.PI / 2) + W;
        L = 0;
        for (Y = X.length; L < Y; L++) U = e(X[L], w[L], T), k(U.x, U.y, B + da);
        I = 0;
        for (N = Q.length; I < N; I++)
          for (S = Q[I], ca = F[I], L = 0, Y = S.length; L < Y; L++) U = e(S[L], ca[L], T), G ? k(U.x, U.y + K[x - 1].y, K[x - 1].x + da) : k(U.x, U.y, B + da)
      }(function() {
        var a = c.length / 3;
        if (C) {
          var d = 0 * Z;
          for (L = 0; L < ea; L++) V =
            aa[L], l(V[2] + d, V[1] + d, V[0] + d);
          d = Z * (x + 2 * D);
          for (L = 0; L < ea; L++) V = aa[L], l(V[0] + d, V[1] + d, V[2] + d)
        } else {
          for (L = 0; L < ea; L++) V = aa[L], l(V[2], V[1], V[0]);
          for (L = 0; L < ea; L++) V = aa[L], l(V[0] + Z * x, V[1] + Z * x, V[2] + Z * x)
        }
        b.addGroup(a, c.length / 3 - a, 0)
      })();
      (function() {
        var a = c.length / 3,
          d = 0;
        g(X, d);
        d += X.length;
        I = 0;
        for (N = Q.length; I < N; I++) S = Q[I], g(S, d), d += S.length;
        b.addGroup(a, c.length / 3 - a, 1)
      })()
    }
    G.call(this);
    this.type = "ExtrudeBufferGeometry";
    this.parameters = {
      shapes: e,
      options: h
    };
    e = Array.isArray(e) ? e : [e];
    for (var b = this, c = [], d = [], f =
        0, g = e.length; f < g; f++) a(e[f]);
    this.setAttribute("position", new F(c, 3));
    this.setAttribute("uv", new F(d, 2));
    this.computeVertexNormals()
  }

  function Ji(e, h, a) {
    a.shapes = [];
    if (Array.isArray(e))
      for (var b = 0, c = e.length; b < c; b++) a.shapes.push(e[b].uuid);
    else a.shapes.push(e.uuid);
    void 0 !== h.extrudePath && (a.options.extrudePath = h.extrudePath.toJSON());
    return a
  }

  function se(e, h) {
    P.call(this);
    this.type = "TextGeometry";
    this.parameters = {
      text: e,
      parameters: h
    };
    this.fromBufferGeometry(new hd(e, h));
    this.mergeVertices()
  }

  function hd(e,
    h) {
    h = h || {};
    var a = h.font;
    if (!a || !a.isFont) return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."), new P;
    e = a.generateShapes(e, h.size);
    h.depth = void 0 !== h.height ? h.height : 50;
    void 0 === h.bevelThickness && (h.bevelThickness = 10);
    void 0 === h.bevelSize && (h.bevelSize = 8);
    void 0 === h.bevelEnabled && (h.bevelEnabled = !1);
    jb.call(this, e, h);
    this.type = "TextBufferGeometry"
  }

  function te(e, h, a, b, c, d, f) {
    P.call(this);
    this.type = "SphereGeometry";
    this.parameters = {
      radius: e,
      widthSegments: h,
      heightSegments: a,
      phiStart: b,
      phiLength: c,
      thetaStart: d,
      thetaLength: f
    };
    this.fromBufferGeometry(new Ob(e, h, a, b, c, d, f));
    this.mergeVertices()
  }

  function Ob(e, h, a, b, c, d, f) {
    G.call(this);
    this.type = "SphereBufferGeometry";
    this.parameters = {
      radius: e,
      widthSegments: h,
      heightSegments: a,
      phiStart: b,
      phiLength: c,
      thetaStart: d,
      thetaLength: f
    };
    e = e || 1;
    h = Math.max(3, Math.floor(h) || 8);
    a = Math.max(2, Math.floor(a) || 6);
    b = void 0 !== b ? b : 0;
    c = void 0 !== c ? c : 2 * Math.PI;
    d = void 0 !== d ? d : 0;
    f = void 0 !== f ? f : Math.PI;
    var g = Math.min(d + f, Math.PI),
      k, m, n = 0,
      p = [],
      l = new q,
      t = new q,
      r = [],
      u = [],
      v = [],
      w = [];
    for (m = 0; m <= a; m++) {
      var x = [],
        B = m / a,
        C = 0;
      0 == m && 0 == d ? C = .5 / h : m == a && g == Math.PI && (C = -.5 / h);
      for (k = 0; k <= h; k++) {
        var A = k / h;
        l.x = -e * Math.cos(b + A * c) * Math.sin(d + B * f);
        l.y = e * Math.cos(d + B * f);
        l.z = e * Math.sin(b + A * c) * Math.sin(d + B * f);
        u.push(l.x, l.y, l.z);
        t.copy(l).normalize();
        v.push(t.x, t.y, t.z);
        w.push(A + C, 1 - B);
        x.push(n++)
      }
      p.push(x)
    }
    for (m = 0; m < a; m++)
      for (k = 0; k < h; k++) e = p[m][k + 1], b = p[m][k], c = p[m + 1][k], f = p[m + 1][k + 1], (0 !== m || 0 < d) && r.push(e, b, f), (m !== a - 1 || g < Math.PI) && r.push(b, c, f);
    this.setIndex(r);
    this.setAttribute("position",
      new F(u, 3));
    this.setAttribute("normal", new F(v, 3));
    this.setAttribute("uv", new F(w, 2))
  }

  function ue(e, h, a, b, c, d) {
    P.call(this);
    this.type = "RingGeometry";
    this.parameters = {
      innerRadius: e,
      outerRadius: h,
      thetaSegments: a,
      phiSegments: b,
      thetaStart: c,
      thetaLength: d
    };
    this.fromBufferGeometry(new id(e, h, a, b, c, d));
    this.mergeVertices()
  }

  function id(e, h, a, b, c, d) {
    G.call(this);
    this.type = "RingBufferGeometry";
    this.parameters = {
      innerRadius: e,
      outerRadius: h,
      thetaSegments: a,
      phiSegments: b,
      thetaStart: c,
      thetaLength: d
    };
    e = e || .5;
    h = h ||
      1;
    c = void 0 !== c ? c : 0;
    d = void 0 !== d ? d : 2 * Math.PI;
    a = void 0 !== a ? Math.max(3, a) : 8;
    b = void 0 !== b ? Math.max(1, b) : 1;
    var f = [],
      g = [],
      k = [],
      m = [],
      n = e,
      p = (h - e) / b,
      l = new q,
      t = new z,
      r, u;
    for (r = 0; r <= b; r++) {
      for (u = 0; u <= a; u++) e = c + u / a * d, l.x = n * Math.cos(e), l.y = n * Math.sin(e), g.push(l.x, l.y, l.z), k.push(0, 0, 1), t.x = (l.x / h + 1) / 2, t.y = (l.y / h + 1) / 2, m.push(t.x, t.y);
      n += p
    }
    for (r = 0; r < b; r++)
      for (h = r * (a + 1), u = 0; u < a; u++) e = u + h, c = e + a + 1, d = e + a + 2, n = e + 1, f.push(e, c, n), f.push(c, d, n);
    this.setIndex(f);
    this.setAttribute("position", new F(g, 3));
    this.setAttribute("normal",
      new F(k, 3));
    this.setAttribute("uv", new F(m, 2))
  }

  function ve(e, h, a, b) {
    P.call(this);
    this.type = "LatheGeometry";
    this.parameters = {
      points: e,
      segments: h,
      phiStart: a,
      phiLength: b
    };
    this.fromBufferGeometry(new jd(e, h, a, b));
    this.mergeVertices()
  }

  function jd(e, h, a, b) {
    G.call(this);
    this.type = "LatheBufferGeometry";
    this.parameters = {
      points: e,
      segments: h,
      phiStart: a,
      phiLength: b
    };
    h = Math.floor(h) || 12;
    a = a || 0;
    b = b || 2 * Math.PI;
    b = N.clamp(b, 0, 2 * Math.PI);
    var c = [],
      d = [],
      f = [],
      g = 1 / h,
      k = new q,
      m = new z,
      n;
    for (n = 0; n <= h; n++) {
      var p = a + n * g * b;
      var l =
        Math.sin(p),
        t = Math.cos(p);
      for (p = 0; p <= e.length - 1; p++) k.x = e[p].x * l, k.y = e[p].y, k.z = e[p].x * t, d.push(k.x, k.y, k.z), m.x = n / h, m.y = p / (e.length - 1), f.push(m.x, m.y)
    }
    for (n = 0; n < h; n++)
      for (p = 0; p < e.length - 1; p++) a = p + n * e.length, g = a + e.length, k = a + e.length + 1, m = a + 1, c.push(a, g, m), c.push(g, k, m);
    this.setIndex(c);
    this.setAttribute("position", new F(d, 3));
    this.setAttribute("uv", new F(f, 2));
    this.computeVertexNormals();
    if (b === 2 * Math.PI)
      for (b = this.attributes.normal.array, c = new q, d = new q, f = new q, a = h * e.length * 3, p = n = 0; n < e.length; n++,
        p += 3) c.x = b[p + 0], c.y = b[p + 1], c.z = b[p + 2], d.x = b[a + p + 0], d.y = b[a + p + 1], d.z = b[a + p + 2], f.addVectors(c, d).normalize(), b[p + 0] = b[a + p + 0] = f.x, b[p + 1] = b[a + p + 1] = f.y, b[p + 2] = b[a + p + 2] = f.z
  }

  function pc(e, h) {
    P.call(this);
    this.type = "ShapeGeometry";
    "object" === typeof h && (console.warn("THREE.ShapeGeometry: Options parameter has been removed."), h = h.curveSegments);
    this.parameters = {
      shapes: e,
      curveSegments: h
    };
    this.fromBufferGeometry(new qc(e, h));
    this.mergeVertices()
  }

  function qc(e, h) {
    function a(a) {
      var e, g = c.length / 3;
      a = a.extractPoints(h);
      var m = a.shape,
        n = a.holes;
      !1 === xb.isClockWise(m) && (m = m.reverse());
      a = 0;
      for (e = n.length; a < e; a++) {
        var l = n[a];
        !0 === xb.isClockWise(l) && (n[a] = l.reverse())
      }
      var q = xb.triangulateShape(m, n);
      a = 0;
      for (e = n.length; a < e; a++) l = n[a], m = m.concat(l);
      a = 0;
      for (e = m.length; a < e; a++) l = m[a], c.push(l.x, l.y, 0), d.push(0, 0, 1), f.push(l.x, l.y);
      a = 0;
      for (e = q.length; a < e; a++) m = q[a], b.push(m[0] + g, m[1] + g, m[2] + g), k += 3
    }
    G.call(this);
    this.type = "ShapeBufferGeometry";
    this.parameters = {
      shapes: e,
      curveSegments: h
    };
    h = h || 12;
    var b = [],
      c = [],
      d = [],
      f = [],
      g = 0,
      k =
      0;
    if (!1 === Array.isArray(e)) a(e);
    else
      for (var m = 0; m < e.length; m++) a(e[m]), this.addGroup(g, k, m), g += k, k = 0;
    this.setIndex(b);
    this.setAttribute("position", new F(c, 3));
    this.setAttribute("normal", new F(d, 3));
    this.setAttribute("uv", new F(f, 2))
  }

  function Ki(e, h) {
    h.shapes = [];
    if (Array.isArray(e))
      for (var a = 0, b = e.length; a < b; a++) h.shapes.push(e[a].uuid);
    else h.shapes.push(e.uuid);
    return h
  }

  function kd(e, h) {
    G.call(this);
    this.type = "EdgesGeometry";
    this.parameters = {
      thresholdAngle: h
    };
    var a = [];
    h = Math.cos(N.DEG2RAD * (void 0 !==
      h ? h : 1));
    var b = [0, 0],
      c = {},
      d = ["a", "b", "c"];
    if (e.isBufferGeometry) {
      var f = new P;
      f.fromBufferGeometry(e)
    } else f = e.clone();
    f.mergeVertices();
    f.computeFaceNormals();
    e = f.vertices;
    f = f.faces;
    for (var g = 0, k = f.length; g < k; g++)
      for (var m = f[g], n = 0; 3 > n; n++) {
        var p = m[d[n]];
        var l = m[d[(n + 1) % 3]];
        b[0] = Math.min(p, l);
        b[1] = Math.max(p, l);
        p = b[0] + "," + b[1];
        void 0 === c[p] ? c[p] = {
          index1: b[0],
          index2: b[1],
          face1: g,
          face2: void 0
        } : c[p].face2 = g
      }
    for (p in c)
      if (b = c[p], void 0 === b.face2 || f[b.face1].normal.dot(f[b.face2].normal) <= h) d = e[b.index1],
        a.push(d.x, d.y, d.z), d = e[b.index2], a.push(d.x, d.y, d.z);
    this.setAttribute("position", new F(a, 3))
  }

  function rc(e, h, a, b, c, d, f, g) {
    P.call(this);
    this.type = "CylinderGeometry";
    this.parameters = {
      radiusTop: e,
      radiusBottom: h,
      height: a,
      radialSegments: b,
      heightSegments: c,
      openEnded: d,
      thetaStart: f,
      thetaLength: g
    };
    this.fromBufferGeometry(new yb(e, h, a, b, c, d, f, g));
    this.mergeVertices()
  }

  function yb(e, h, a, b, c, d, f, g) {
    function k(a) {
      var c, d = new z,
        k = new q,
        y = 0,
        u = !0 === a ? e : h,
        x = !0 === a ? 1 : -1;
      var D = r;
      for (c = 1; c <= b; c++) p.push(0, v * x, 0), l.push(0,
        x, 0), t.push(.5, .5), r++;
      var E = r;
      for (c = 0; c <= b; c++) {
        var F = c / b * g + f,
          G = Math.cos(F);
        F = Math.sin(F);
        k.x = u * F;
        k.y = v * x;
        k.z = u * G;
        p.push(k.x, k.y, k.z);
        l.push(0, x, 0);
        d.x = .5 * G + .5;
        d.y = .5 * F * x + .5;
        t.push(d.x, d.y);
        r++
      }
      for (c = 0; c < b; c++) d = D + c, k = E + c, !0 === a ? n.push(k, k + 1, d) : n.push(k + 1, k, d), y += 3;
      m.addGroup(w, y, !0 === a ? 1 : 2);
      w += y
    }
    G.call(this);
    this.type = "CylinderBufferGeometry";
    this.parameters = {
      radiusTop: e,
      radiusBottom: h,
      height: a,
      radialSegments: b,
      heightSegments: c,
      openEnded: d,
      thetaStart: f,
      thetaLength: g
    };
    var m = this;
    e = void 0 !== e ? e : 1;
    h = void 0 !== h ? h : 1;
    a = a || 1;
    b = Math.floor(b) || 8;
    c = Math.floor(c) || 1;
    d = void 0 !== d ? d : !1;
    f = void 0 !== f ? f : 0;
    g = void 0 !== g ? g : 2 * Math.PI;
    var n = [],
      p = [],
      l = [],
      t = [],
      r = 0,
      u = [],
      v = a / 2,
      w = 0;
    (function() {
      var d, k, y = new q,
        A = new q,
        z = 0,
        D = (h - e) / a;
      for (k = 0; k <= c; k++) {
        var E = [],
          F = k / c,
          H = F * (h - e) + e;
        for (d = 0; d <= b; d++) {
          var G = d / b,
            I = G * g + f,
            K = Math.sin(I);
          I = Math.cos(I);
          A.x = H * K;
          A.y = -F * a + v;
          A.z = H * I;
          p.push(A.x, A.y, A.z);
          y.set(K, D, I).normalize();
          l.push(y.x, y.y, y.z);
          t.push(G, 1 - F);
          E.push(r++)
        }
        u.push(E)
      }
      for (d = 0; d < b; d++)
        for (k = 0; k < c; k++) y = u[k + 1][d], A = u[k +
          1][d + 1], D = u[k][d + 1], n.push(u[k][d], y, D), n.push(y, A, D), z += 6;
      m.addGroup(w, z, 0);
      w += z
    })();
    !1 === d && (0 < e && k(!0), 0 < h && k(!1));
    this.setIndex(n);
    this.setAttribute("position", new F(p, 3));
    this.setAttribute("normal", new F(l, 3));
    this.setAttribute("uv", new F(t, 2))
  }

  function we(e, h, a, b, c, d, f) {
    rc.call(this, 0, e, h, a, b, c, d, f);
    this.type = "ConeGeometry";
    this.parameters = {
      radius: e,
      height: h,
      radialSegments: a,
      heightSegments: b,
      openEnded: c,
      thetaStart: d,
      thetaLength: f
    }
  }

  function xe(e, h, a, b, c, d, f) {
    yb.call(this, 0, e, h, a, b, c, d, f);
    this.type =
      "ConeBufferGeometry";
    this.parameters = {
      radius: e,
      height: h,
      radialSegments: a,
      heightSegments: b,
      openEnded: c,
      thetaStart: d,
      thetaLength: f
    }
  }

  function ye(e, h, a, b) {
    P.call(this);
    this.type = "CircleGeometry";
    this.parameters = {
      radius: e,
      segments: h,
      thetaStart: a,
      thetaLength: b
    };
    this.fromBufferGeometry(new ld(e, h, a, b));
    this.mergeVertices()
  }

  function ld(e, h, a, b) {
    G.call(this);
    this.type = "CircleBufferGeometry";
    this.parameters = {
      radius: e,
      segments: h,
      thetaStart: a,
      thetaLength: b
    };
    e = e || 1;
    h = void 0 !== h ? Math.max(3, h) : 8;
    a = void 0 !== a ? a :
      0;
    b = void 0 !== b ? b : 2 * Math.PI;
    var c = [],
      d = [],
      f = [],
      g = [],
      k, m = new q,
      n = new z;
    d.push(0, 0, 0);
    f.push(0, 0, 1);
    g.push(.5, .5);
    var p = 0;
    for (k = 3; p <= h; p++, k += 3) {
      var l = a + p / h * b;
      m.x = e * Math.cos(l);
      m.y = e * Math.sin(l);
      d.push(m.x, m.y, m.z);
      f.push(0, 0, 1);
      n.x = (d[k] / e + 1) / 2;
      n.y = (d[k + 1] / e + 1) / 2;
      g.push(n.x, n.y)
    }
    for (k = 1; k <= h; k++) c.push(k, k + 1, 0);
    this.setIndex(c);
    this.setAttribute("position", new F(d, 3));
    this.setAttribute("normal", new F(f, 3));
    this.setAttribute("uv", new F(g, 2))
  }

  function sc(e) {
    R.call(this);
    this.type = "ShadowMaterial";
    this.color =
      new D(0);
    this.transparent = !0;
    this.setValues(e)
  }

  function md(e) {
    Aa.call(this, e);
    this.type = "RawShaderMaterial"
  }

  function kb(e) {
    R.call(this);
    this.defines = {
      STANDARD: ""
    };
    this.type = "MeshStandardMaterial";
    this.color = new D(16777215);
    this.metalness = this.roughness = .5;
    this.lightMap = this.map = null;
    this.lightMapIntensity = 1;
    this.aoMap = null;
    this.aoMapIntensity = 1;
    this.emissive = new D(0);
    this.emissiveIntensity = 1;
    this.bumpMap = this.emissiveMap = null;
    this.bumpScale = 1;
    this.normalMap = null;
    this.normalMapType = 0;
    this.normalScale =
      new z(1, 1);
    this.displacementMap = null;
    this.displacementScale = 1;
    this.displacementBias = 0;
    this.envMap = this.alphaMap = this.metalnessMap = this.roughnessMap = null;
    this.envMapIntensity = 1;
    this.refractionRatio = .98;
    this.wireframe = !1;
    this.wireframeLinewidth = 1;
    this.wireframeLinejoin = this.wireframeLinecap = "round";
    this.morphNormals = this.morphTargets = this.skinning = !1;
    this.setValues(e)
  }

  function tc(e) {
    kb.call(this);
    this.defines = {
      STANDARD: "",
      PHYSICAL: ""
    };
    this.type = "MeshPhysicalMaterial";
    this.reflectivity = .5;
    this.clearcoatRoughness =
      this.clearcoat = 0;
    this.sheen = null;
    this.clearcoatNormalScale = new z(1, 1);
    this.clearcoatNormalMap = null;
    this.transparency = 0;
    this.setValues(e)
  }

  function Wa(e) {
    R.call(this);
    this.type = "MeshPhongMaterial";
    this.color = new D(16777215);
    this.specular = new D(1118481);
    this.shininess = 30;
    this.lightMap = this.map = null;
    this.lightMapIntensity = 1;
    this.aoMap = null;
    this.aoMapIntensity = 1;
    this.emissive = new D(0);
    this.emissiveIntensity = 1;
    this.bumpMap = this.emissiveMap = null;
    this.bumpScale = 1;
    this.normalMap = null;
    this.normalMapType = 0;
    this.normalScale = new z(1, 1);
    this.displacementMap = null;
    this.displacementScale = 1;
    this.displacementBias = 0;
    this.envMap = this.alphaMap = this.specularMap = null;
    this.combine = 0;
    this.reflectivity = 1;
    this.refractionRatio = .98;
    this.wireframe = !1;
    this.wireframeLinewidth = 1;
    this.wireframeLinejoin = this.wireframeLinecap = "round";
    this.morphNormals = this.morphTargets = this.skinning = !1;
    this.setValues(e)
  }

  function uc(e) {
    Wa.call(this);
    this.defines = {
      TOON: ""
    };
    this.type = "MeshToonMaterial";
    this.gradientMap = null;
    this.setValues(e)
  }

  function vc(e) {
    R.call(this);
    this.type = "MeshNormalMaterial";
    this.bumpMap = null;
    this.bumpScale = 1;
    this.normalMap = null;
    this.normalMapType = 0;
    this.normalScale = new z(1, 1);
    this.displacementMap = null;
    this.displacementScale = 1;
    this.displacementBias = 0;
    this.wireframe = !1;
    this.wireframeLinewidth = 1;
    this.morphNormals = this.morphTargets = this.skinning = this.fog = !1;
    this.setValues(e)
  }

  function wc(e) {
    R.call(this);
    this.type = "MeshLambertMaterial";
    this.color = new D(16777215);
    this.lightMap = this.map = null;
    this.lightMapIntensity = 1;
    this.aoMap = null;
    this.aoMapIntensity =
      1;
    this.emissive = new D(0);
    this.emissiveIntensity = 1;
    this.envMap = this.alphaMap = this.specularMap = this.emissiveMap = null;
    this.combine = 0;
    this.reflectivity = 1;
    this.refractionRatio = .98;
    this.wireframe = !1;
    this.wireframeLinewidth = 1;
    this.wireframeLinejoin = this.wireframeLinecap = "round";
    this.morphNormals = this.morphTargets = this.skinning = !1;
    this.setValues(e)
  }

  function xc(e) {
    R.call(this);
    this.defines = {
      MATCAP: ""
    };
    this.type = "MeshMatcapMaterial";
    this.color = new D(16777215);
    this.bumpMap = this.map = this.matcap = null;
    this.bumpScale =
      1;
    this.normalMap = null;
    this.normalMapType = 0;
    this.normalScale = new z(1, 1);
    this.displacementMap = null;
    this.displacementScale = 1;
    this.displacementBias = 0;
    this.alphaMap = null;
    this.morphNormals = this.morphTargets = this.skinning = !1;
    this.setValues(e)
  }

  function yc(e) {
    T.call(this);
    this.type = "LineDashedMaterial";
    this.scale = 1;
    this.dashSize = 3;
    this.gapSize = 1;
    this.setValues(e)
  }

  function La(e, h, a, b) {
    this.parameterPositions = e;
    this._cachedIndex = 0;
    this.resultBuffer = void 0 !== b ? b : new h.constructor(a);
    this.sampleValues = h;
    this.valueSize =
      a
  }

  function jf(e, h, a, b) {
    La.call(this, e, h, a, b);
    this._offsetNext = this._weightNext = this._offsetPrev = this._weightPrev = -0
  }

  function ze(e, h, a, b) {
    La.call(this, e, h, a, b)
  }

  function kf(e, h, a, b) {
    La.call(this, e, h, a, b)
  }

  function ua(e, h, a, b) {
    if (void 0 === e) throw Error("THREE.KeyframeTrack: track name is undefined");
    if (void 0 === h || 0 === h.length) throw Error("THREE.KeyframeTrack: no keyframes in track named " + e);
    this.name = e;
    this.times = aa.convertArray(h, this.TimeBufferType);
    this.values = aa.convertArray(a, this.ValueBufferType);
    this.setInterpolation(b || this.DefaultInterpolation)
  }

  function lf(e, h, a) {
    ua.call(this, e, h, a)
  }

  function mf(e, h, a, b) {
    ua.call(this, e, h, a, b)
  }

  function nd(e, h, a, b) {
    ua.call(this, e, h, a, b)
  }

  function nf(e, h, a, b) {
    La.call(this, e, h, a, b)
  }

  function Ae(e, h, a, b) {
    ua.call(this, e, h, a, b)
  }

  function of (e, h, a, b) {
    ua.call(this, e, h, a, b)
  }

  function od(e, h, a, b) {
    ua.call(this, e, h, a, b)
  }

  function Pa(e, h, a) {
    this.name = e;
    this.tracks = a;
    this.duration = void 0 !== h ? h : -1;
    this.uuid = N.generateUUID();
    0 > this.duration && this.resetDuration()
  }

  function nl(e) {
    switch (e.toLowerCase()) {
      case "scalar":
      case "double":
      case "float":
      case "number":
      case "integer":
        return nd;
      case "vector":
      case "vector2":
      case "vector3":
      case "vector4":
        return od;
      case "color":
        return mf;
      case "quaternion":
        return Ae;
      case "bool":
      case "boolean":
        return lf;
      case "string":
        return of
    }
    throw Error("THREE.KeyframeTrack: Unsupported typeName: " + e);
  }

  function ol(e) {
    if (void 0 === e.type) throw Error("THREE.KeyframeTrack: track type undefined, can not parse");
    var h = nl(e.type);
    if (void 0 === e.times) {
      var a = [],
        b = [];
      aa.flattenJSON(e.keys, a, b, "value");
      e.times = a;
      e.values = b
    }
    return void 0 !== h.parse ? h.parse(e) : new h(e.name,
      e.times, e.values, e.interpolation)
  }

  function Og(e, h, a) {
    var b = this,
      c = !1,
      d = 0,
      f = 0,
      g = void 0,
      k = [];
    this.onStart = void 0;
    this.onLoad = e;
    this.onProgress = h;
    this.onError = a;
    this.itemStart = function(a) {
      f++;
      if (!1 === c && void 0 !== b.onStart) b.onStart(a, d, f);
      c = !0
    };
    this.itemEnd = function(a) {
      d++;
      if (void 0 !== b.onProgress) b.onProgress(a, d, f);
      if (d === f && (c = !1, void 0 !== b.onLoad)) b.onLoad()
    };
    this.itemError = function(a) {
      if (void 0 !== b.onError) b.onError(a)
    };
    this.resolveURL = function(a) {
      return g ? g(a) : a
    };
    this.setURLModifier = function(a) {
      g =
        a;
      return this
    };
    this.addHandler = function(a, b) {
      k.push(a, b);
      return this
    };
    this.removeHandler = function(a) {
      a = k.indexOf(a); - 1 !== a && k.splice(a, 2);
      return this
    };
    this.getHandler = function(a) {
      for (var b = 0, c = k.length; b < c; b += 2) {
        var d = k[b + 1];
        if (k[b].test(a)) return d
      }
      return null
    }
  }

  function X(e) {
    this.manager = void 0 !== e ? e : Li;
    this.crossOrigin = "anonymous";
    this.resourcePath = this.path = ""
  }

  function Qa(e) {
    X.call(this, e)
  }

  function Pg(e) {
    X.call(this, e)
  }

  function Qg(e) {
    X.call(this, e)
  }

  function pf(e) {
    X.call(this, e)
  }

  function pd(e) {
    X.call(this,
      e)
  }

  function qf(e) {
    X.call(this, e)
  }

  function rf(e) {
    X.call(this, e)
  }

  function M() {
    this.type = "Curve";
    this.arcLengthDivisions = 200
  }

  function Ma(e, h, a, b, c, d, f, g) {
    M.call(this);
    this.type = "EllipseCurve";
    this.aX = e || 0;
    this.aY = h || 0;
    this.xRadius = a || 1;
    this.yRadius = b || 1;
    this.aStartAngle = c || 0;
    this.aEndAngle = d || 2 * Math.PI;
    this.aClockwise = f || !1;
    this.aRotation = g || 0
  }

  function qd(e, h, a, b, c, d) {
    Ma.call(this, e, h, a, a, b, c, d);
    this.type = "ArcCurve"
  }

  function Rg() {
    var e = 0,
      h = 0,
      a = 0,
      b = 0;
    return {
      initCatmullRom: function(c, d, f, g, k) {
        c = k * (f - c);
        g = k * (g - d);
        e = d;
        h = c;
        a = -3 * d + 3 * f - 2 * c - g;
        b = 2 * d - 2 * f + c + g
      },
      initNonuniformCatmullRom: function(c, d, f, g, k, m, n) {
        c = ((d - c) / k - (f - c) / (k + m) + (f - d) / m) * m;
        g = ((f - d) / m - (g - d) / (m + n) + (g - f) / n) * m;
        e = d;
        h = c;
        a = -3 * d + 3 * f - 2 * c - g;
        b = 2 * d - 2 * f + c + g
      },
      calc: function(c) {
        var d = c * c;
        return e + h * c + a * d + b * d * c
      }
    }
  }

  function la(e, h, a, b) {
    M.call(this);
    this.type = "CatmullRomCurve3";
    this.points = e || [];
    this.closed = h || !1;
    this.curveType = a || "centripetal";
    this.tension = b || .5
  }

  function Mi(e, h, a, b, c) {
    h = .5 * (b - h);
    c = .5 * (c - a);
    var d = e * e;
    return (2 * a - 2 * b + h + c) * e * d + (-3 * a + 3 * b - 2 * h -
      c) * d + h * e + a
  }

  function Be(e, h, a, b) {
    var c = 1 - e;
    return c * c * h + 2 * (1 - e) * e * a + e * e * b
  }

  function Ce(e, h, a, b, c) {
    var d = 1 - e,
      f = 1 - e;
    return d * d * d * h + 3 * f * f * e * a + 3 * (1 - e) * e * e * b + e * e * e * c
  }

  function Xa(e, h, a, b) {
    M.call(this);
    this.type = "CubicBezierCurve";
    this.v0 = e || new z;
    this.v1 = h || new z;
    this.v2 = a || new z;
    this.v3 = b || new z
  }

  function lb(e, h, a, b) {
    M.call(this);
    this.type = "CubicBezierCurve3";
    this.v0 = e || new q;
    this.v1 = h || new q;
    this.v2 = a || new q;
    this.v3 = b || new q
  }

  function Ga(e, h) {
    M.call(this);
    this.type = "LineCurve";
    this.v1 = e || new z;
    this.v2 = h ||
      new z
  }

  function Ya(e, h) {
    M.call(this);
    this.type = "LineCurve3";
    this.v1 = e || new q;
    this.v2 = h || new q
  }

  function Za(e, h, a) {
    M.call(this);
    this.type = "QuadraticBezierCurve";
    this.v0 = e || new z;
    this.v1 = h || new z;
    this.v2 = a || new z
  }

  function mb(e, h, a) {
    M.call(this);
    this.type = "QuadraticBezierCurve3";
    this.v0 = e || new q;
    this.v1 = h || new q;
    this.v2 = a || new q
  }

  function $a(e) {
    M.call(this);
    this.type = "SplineCurve";
    this.points = e || []
  }

  function zb() {
    M.call(this);
    this.type = "CurvePath";
    this.curves = [];
    this.autoClose = !1
  }

  function ab(e) {
    zb.call(this);
    this.type = "Path";
    this.currentPoint = new z;
    e && this.setFromPoints(e)
  }

  function Pb(e) {
    ab.call(this, e);
    this.uuid = N.generateUUID();
    this.type = "Shape";
    this.holes = []
  }

  function da(e, h) {
    E.call(this);
    this.type = "Light";
    this.color = new D(e);
    this.intensity = void 0 !== h ? h : 1;
    this.receiveShadow = void 0
  }

  function sf(e, h, a) {
    da.call(this, e, a);
    this.type = "HemisphereLight";
    this.castShadow = void 0;
    this.position.copy(E.DefaultUp);
    this.updateMatrix();
    this.groundColor = new D(h)
  }

  function nb(e) {
    this.camera = e;
    this.bias = 0;
    this.radius = 1;
    this.mapSize = new z(512, 512);
    this.mapPass = this.map = null;
    this.matrix = new I;
    this._frustum = new Sd;
    this._frameExtents = new z(1, 1);
    this._viewportCount = 1;
    this._viewports = [new ca(0, 0, 1, 1)]
  }

  function tf() {
    nb.call(this, new na(50, 1, .5, 500))
  }

  function uf(e, h, a, b, c, d) {
    da.call(this, e, h);
    this.type = "SpotLight";
    this.position.copy(E.DefaultUp);
    this.updateMatrix();
    this.target = new E;
    Object.defineProperty(this, "power", {
      get: function() {
        return this.intensity * Math.PI
      },
      set: function(a) {
        this.intensity = a / Math.PI
      }
    });
    this.distance =
      void 0 !== a ? a : 0;
    this.angle = void 0 !== b ? b : Math.PI / 3;
    this.penumbra = void 0 !== c ? c : 0;
    this.decay = void 0 !== d ? d : 1;
    this.shadow = new tf
  }

  function Sg() {
    nb.call(this, new na(90, 1, .5, 500));
    this._frameExtents = new z(4, 2);
    this._viewportCount = 6;
    this._viewports = [new ca(2, 1, 1, 1), new ca(0, 1, 1, 1), new ca(3, 1, 1, 1), new ca(1, 1, 1, 1), new ca(3, 0, 1, 1), new ca(1, 0, 1, 1)];
    this._cubeDirections = [new q(1, 0, 0), new q(-1, 0, 0), new q(0, 0, 1), new q(0, 0, -1), new q(0, 1, 0), new q(0, -1, 0)];
    this._cubeUps = [new q(0, 1, 0), new q(0, 1, 0), new q(0, 1, 0), new q(0,
      1, 0), new q(0, 0, 1), new q(0, 0, -1)]
  }

  function vf(e, h, a, b) {
    da.call(this, e, h);
    this.type = "PointLight";
    Object.defineProperty(this, "power", {
      get: function() {
        return 4 * this.intensity * Math.PI
      },
      set: function(a) {
        this.intensity = a / (4 * Math.PI)
      }
    });
    this.distance = void 0 !== a ? a : 0;
    this.decay = void 0 !== b ? b : 1;
    this.shadow = new Sg
  }

  function De(e, h, a, b, c, d) {
    hb.call(this);
    this.type = "OrthographicCamera";
    this.zoom = 1;
    this.view = null;
    this.left = void 0 !== e ? e : -1;
    this.right = void 0 !== h ? h : 1;
    this.top = void 0 !== a ? a : 1;
    this.bottom = void 0 !== b ? b : -1;
    this.near = void 0 !== c ? c : .1;
    this.far = void 0 !== d ? d : 2E3;
    this.updateProjectionMatrix()
  }

  function wf() {
    nb.call(this, new De(-5, 5, 5, -5, .5, 500))
  }

  function xf(e, h) {
    da.call(this, e, h);
    this.type = "DirectionalLight";
    this.position.copy(E.DefaultUp);
    this.updateMatrix();
    this.target = new E;
    this.shadow = new wf
  }

  function yf(e, h) {
    da.call(this, e, h);
    this.type = "AmbientLight";
    this.castShadow = void 0
  }

  function zf(e, h, a, b) {
    da.call(this, e, h);
    this.type = "RectAreaLight";
    this.width = void 0 !== a ? a : 10;
    this.height = void 0 !== b ? b : 10
  }

  function Af(e) {
    X.call(this,
      e);
    this.textures = {}
  }

  function Bf() {
    G.call(this);
    this.type = "InstancedBufferGeometry";
    this.maxInstancedCount = void 0
  }

  function Cf(e, h, a, b) {
    "number" === typeof a && (b = a, a = !1, console.error("THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument."));
    O.call(this, e, h, a);
    this.meshPerAttribute = b || 1
  }

  function Df(e) {
    X.call(this, e)
  }

  function Ef(e) {
    X.call(this, e)
  }

  function Tg(e) {
    "undefined" === typeof createImageBitmap && console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported.");
    "undefined" === typeof fetch && console.warn("THREE.ImageBitmapLoader: fetch() not supported.");
    X.call(this, e);
    this.options = void 0
  }

  function Ug() {
    this.type = "ShapePath";
    this.color = new D;
    this.subPaths = [];
    this.currentPath = null
  }

  function Vg(e) {
    this.type = "Font";
    this.data = e
  }

  function Wg(e) {
    X.call(this, e)
  }

  function Ff(e) {
    X.call(this, e)
  }

  function Gf() {
    this.coefficients = [];
    for (var e = 0; 9 > e; e++) this.coefficients.push(new q)
  }

  function bb(e, h) {
    da.call(this, void 0, h);
    this.sh = void 0 !== e ? e : new Gf
  }

  function Xg(e, h, a) {
    bb.call(this,
      void 0, a);
    e = (new D).set(e);
    a = (new D).set(h);
    h = new q(e.r, e.g, e.b);
    e = new q(a.r, a.g, a.b);
    a = Math.sqrt(Math.PI);
    var b = a * Math.sqrt(.75);
    this.sh.coefficients[0].copy(h).add(e).multiplyScalar(a);
    this.sh.coefficients[1].copy(h).sub(e).multiplyScalar(b)
  }

  function Yg(e, h) {
    bb.call(this, void 0, h);
    e = (new D).set(e);
    this.sh.coefficients[0].set(e.r, e.g, e.b).multiplyScalar(2 * Math.sqrt(Math.PI))
  }

  function Ni() {
    this.type = "StereoCamera";
    this.aspect = 1;
    this.eyeSep = .064;
    this.cameraL = new na;
    this.cameraL.layers.enable(1);
    this.cameraL.matrixAutoUpdate = !1;
    this.cameraR = new na;
    this.cameraR.layers.enable(2);
    this.cameraR.matrixAutoUpdate = !1;
    this._cache = {
      focus: null,
      fov: null,
      aspect: null,
      near: null,
      far: null,
      zoom: null,
      eyeSep: null
    }
  }

  function Zg(e) {
    this.autoStart = void 0 !== e ? e : !0;
    this.elapsedTime = this.oldTime = this.startTime = 0;
    this.running = !1
  }

  function $g() {
    E.call(this);
    this.type = "AudioListener";
    this.context = ah.getContext();
    this.gain = this.context.createGain();
    this.gain.connect(this.context.destination);
    this.filter = null;
    this.timeDelta = 0;
    this._clock = new Zg
  }

  function rd(e) {
    E.call(this);
    this.type = "Audio";
    this.listener = e;
    this.context = e.context;
    this.gain = this.context.createGain();
    this.gain.connect(e.getInput());
    this.autoplay = !1;
    this.buffer = null;
    this.detune = 0;
    this.loop = !1;
    this.offset = this.loopEnd = this.loopStart = 0;
    this.duration = void 0;
    this.playbackRate = 1;
    this.isPlaying = !1;
    this.hasPlaybackControl = !0;
    this.sourceType = "empty";
    this._pausedAt = this._startedAt = 0;
    this.filters = []
  }

  function bh(e) {
    rd.call(this, e);
    this.panner = this.context.createPanner();
    this.panner.panningModel = "HRTF";
    this.panner.connect(this.gain)
  }

  function ch(e, h) {
    this.analyser = e.context.createAnalyser();
    this.analyser.fftSize = void 0 !== h ? h : 2048;
    this.data = new Uint8Array(this.analyser.frequencyBinCount);
    e.getOutput().connect(this.analyser)
  }

  function dh(e, h, a) {
    this.binding = e;
    this.valueSize = a;
    e = Float64Array;
    switch (h) {
      case "quaternion":
        h = this._slerp;
        break;
      case "string":
      case "bool":
        e = Array;
        h = this._select;
        break;
      default:
        h = this._lerp
    }
    this.buffer = new e(4 * a);
    this._mixBufferRegion = h;
    this.referenceCount = this.useCount = this.cumulativeWeight = 0
  }

  function Oi(e,
    h, a) {
    a = a || ja.parseTrackName(h);
    this._targetGroup = e;
    this._bindings = e.subscribe_(h, a)
  }

  function ja(e, h, a) {
    this.path = h;
    this.parsedPath = a || ja.parseTrackName(h);
    this.node = ja.findNode(e, this.parsedPath.nodeName) || e;
    this.rootNode = e
  }

  function Pi() {
    this.uuid = N.generateUUID();
    this._objects = Array.prototype.slice.call(arguments);
    this.nCachedObjects_ = 0;
    var e = {};
    this._indicesByUUID = e;
    for (var h = 0, a = arguments.length; h !== a; ++h) e[arguments[h].uuid] = h;
    this._paths = [];
    this._parsedPaths = [];
    this._bindings = [];
    this._bindingsIndicesByPath = {};
    var b = this;
    this.stats = {
      objects: {
        get total() {
          return b._objects.length
        },
        get inUse() {
          return this.total - b.nCachedObjects_
        }
      },
      get bindingsPerObject() {
        return b._bindings.length
      }
    }
  }

  function Qi(e, h, a) {
    this._mixer = e;
    this._clip = h;
    this._localRoot = a || null;
    e = h.tracks;
    h = e.length;
    a = Array(h);
    for (var b = {
        endingStart: 2400,
        endingEnd: 2400
      }, c = 0; c !== h; ++c) {
      var d = e[c].createInterpolant(null);
      a[c] = d;
      d.settings = b
    }
    this._interpolantSettings = b;
    this._interpolants = a;
    this._propertyBindings = Array(h);
    this._weightInterpolant = this._timeScaleInterpolant =
      this._byClipCacheIndex = this._cacheIndex = null;
    this.loop = 2201;
    this._loopCount = -1;
    this._startTime = null;
    this.time = 0;
    this._effectiveWeight = this.weight = this._effectiveTimeScale = this.timeScale = 1;
    this.repetitions = Infinity;
    this.paused = !1;
    this.enabled = !0;
    this.clampWhenFinished = !1;
    this.zeroSlopeAtEnd = this.zeroSlopeAtStart = !0
  }

  function eh(e) {
    this._root = e;
    this._initMemoryManager();
    this.time = this._accuIndex = 0;
    this.timeScale = 1
  }

  function Hf(e, h) {
    "string" === typeof e && (console.warn("THREE.Uniform: Type parameter is no longer needed."),
      e = h);
    this.value = e
  }

  function fh(e, h, a) {
    wb.call(this, e, h);
    this.meshPerAttribute = a || 1
  }

  function Ri(e, h, a, b) {
    this.ray = new ac(e, h);
    this.near = a || 0;
    this.far = b || Infinity;
    this.camera = null;
    this.params = {
      Mesh: {},
      Line: {},
      LOD: {},
      Points: {
        threshold: 1
      },
      Sprite: {}
    };
    Object.defineProperties(this.params, {
      PointCloud: {
        get: function() {
          console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points.");
          return this.Points
        }
      }
    })
  }

  function Si(e, h) {
    return e.distance - h.distance
  }

  function gh(e, h, a, b) {
    if (!1 !== e.visible &&
      (e.raycast(h, a), !0 === b)) {
      e = e.children;
      b = 0;
      for (var c = e.length; b < c; b++) gh(e[b], h, a, !0)
    }
  }

  function Ti(e, h, a) {
    this.radius = void 0 !== e ? e : 1;
    this.phi = void 0 !== h ? h : 0;
    this.theta = void 0 !== a ? a : 0;
    return this
  }

  function Ui(e, h, a) {
    this.radius = void 0 !== e ? e : 1;
    this.theta = void 0 !== h ? h : 0;
    this.y = void 0 !== a ? a : 0;
    return this
  }

  function hh(e, h) {
    this.min = void 0 !== e ? e : new z(Infinity, Infinity);
    this.max = void 0 !== h ? h : new z(-Infinity, -Infinity)
  }

  function ih(e, h) {
    this.start = void 0 !== e ? e : new q;
    this.end = void 0 !== h ? h : new q
  }

  function Ee(e) {
    E.call(this);
    this.material = e;
    this.render = function() {}
  }

  function Fe(e, h, a, b) {
    this.object = e;
    this.size = void 0 !== h ? h : 1;
    e = void 0 !== a ? a : 16711680;
    b = void 0 !== b ? b : 1;
    h = 0;
    (a = this.object.geometry) && a.isGeometry ? h = 3 * a.faces.length : a && a.isBufferGeometry && (h = a.attributes.normal.count);
    a = new G;
    h = new F(6 * h, 3);
    a.setAttribute("position", h);
    Z.call(this, a, new T({
      color: e,
      linewidth: b
    }));
    this.matrixAutoUpdate = !1;
    this.update()
  }

  function sd(e, h) {
    E.call(this);
    this.light = e;
    this.light.updateMatrixWorld();
    this.matrix = e.matrixWorld;
    this.matrixAutoUpdate = !1;
    this.color = h;
    e = new G;
    h = [0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, -1, 1];
    for (var a = 0, b = 1; 32 > a; a++, b++) {
      var c = a / 32 * Math.PI * 2,
        d = b / 32 * Math.PI * 2;
      h.push(Math.cos(c), Math.sin(c), 1, Math.cos(d), Math.sin(d), 1)
    }
    e.setAttribute("position", new F(h, 3));
    h = new T({
      fog: !1
    });
    this.cone = new Z(e, h);
    this.add(this.cone);
    this.update()
  }

  function Vi(e) {
    var h = [];
    e && e.isBone && h.push(e);
    for (var a = 0; a < e.children.length; a++) h.push.apply(h, Vi(e.children[a]));
    return h
  }

  function td(e) {
    for (var h = Vi(e), a = new G, b = [], c = [], d = new D(0, 0, 1), f = new D(0, 1, 0), g = 0; g < h.length; g++) {
      var k = h[g];
      k.parent && k.parent.isBone && (b.push(0, 0, 0), b.push(0, 0, 0), c.push(d.r, d.g, d.b), c.push(f.r, f.g, f.b))
    }
    a.setAttribute("position", new F(b, 3));
    a.setAttribute("color", new F(c, 3));
    b = new T({
      vertexColors: 2,
      depthTest: !1,
      depthWrite: !1,
      transparent: !0
    });
    Z.call(this, a, b);
    this.root = e;
    this.bones = h;
    this.matrix = e.matrixWorld;
    this.matrixAutoUpdate = !1
  }

  function ud(e, h, a) {
    this.light = e;
    this.light.updateMatrixWorld();
    this.color = a;
    e = new Ob(h, 4, 2);
    h = new Ia({
      wireframe: !0,
      fog: !1
    });
    ia.call(this, e, h);
    this.matrix = this.light.matrixWorld;
    this.matrixAutoUpdate = !1;
    this.update()
  }

  function vd(e, h) {
    this.type = "RectAreaLightHelper";
    this.light = e;
    this.color = h;
    e = new G;
    e.setAttribute("position", new F([1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0], 3));
    e.computeBoundingSphere();
    h = new T({
      fog: !1
    });
    pa.call(this, e, h);
    e = new G;
    e.setAttribute("position", new F([1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0], 3));
    e.computeBoundingSphere();
    this.add(new ia(e, new Ia({
      side: 1,
      fog: !1
    })));
    this.update()
  }

  function wd(e,
    h, a) {
    E.call(this);
    this.light = e;
    this.light.updateMatrixWorld();
    this.matrix = e.matrixWorld;
    this.matrixAutoUpdate = !1;
    this.color = a;
    e = new lc(h);
    e.rotateY(.5 * Math.PI);
    this.material = new Ia({
      wireframe: !0,
      fog: !1
    });
    void 0 === this.color && (this.material.vertexColors = 2);
    h = e.getAttribute("position");
    h = new Float32Array(3 * h.count);
    e.setAttribute("color", new O(h, 3));
    this.add(new ia(e, this.material));
    this.update()
  }

  function xd(e, h) {
    this.lightProbe = e;
    this.size = h;
    e = new Aa({
      defines: {
        GAMMA_OUTPUT: ""
      },
      uniforms: {
        sh: {
          value: this.lightProbe.sh.coefficients
        },
        intensity: {
          value: this.lightProbe.intensity
        }
      },
      vertexShader: "varying vec3 vNormal;\nvoid main() {\n\tvNormal = normalize( normalMatrix * normal );\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",
      fragmentShader: "#define RECIPROCAL_PI 0.318309886\nvec3 inverseTransformDirection( in vec3 normal, in mat4 matrix ) {\n\t// matrix is assumed to be orthogonal\n\treturn normalize( ( vec4( normal, 0.0 ) * matrix ).xyz );\n}\nvec3 linearToOutput( in vec3 a ) {\n\t#ifdef GAMMA_OUTPUT\n\t\treturn pow( a, vec3( 1.0 / float( GAMMA_FACTOR ) ) );\n\t#else\n\t\treturn a;\n\t#endif\n}\n// source: https://graphics.stanford.edu/papers/envmap/envmap.pdf\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\t// normal is assumed to have unit length\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\t// band 0\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\t// band 1\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\t// band 2\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nuniform vec3 sh[ 9 ]; // sh coefficients\nuniform float intensity; // light probe intensity\nvarying vec3 vNormal;\nvoid main() {\n\tvec3 normal = normalize( vNormal );\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, sh );\n\tvec3 outgoingLight = RECIPROCAL_PI * irradiance * intensity;\n\toutgoingLight = linearToOutput( outgoingLight );\n\tgl_FragColor = vec4( outgoingLight, 1.0 );\n}"
    });
    h = new Ob(1, 32, 16);
    ia.call(this, h, e);
    this.onBeforeRender()
  }

  function If(e, h, a, b) {
    e = e || 10;
    h = h || 10;
    a = new D(void 0 !== a ? a : 4473924);
    b = new D(void 0 !== b ? b : 8947848);
    var c = h / 2,
      d = e / h,
      f = e / 2;
    e = [];
    for (var g = [], k = 0, m = 0, n = -f; k <= h; k++, n += d) {
      e.push(-f, 0, n, f, 0, n);
      e.push(n, 0, -f, n, 0, f);
      var p = k === c ? a : b;
      p.toArray(g, m);
      m += 3;
      p.toArray(g, m);
      m += 3;
      p.toArray(g, m);
      m += 3;
      p.toArray(g, m);
      m += 3
    }
    h = new G;
    h.setAttribute("position", new F(e, 3));
    h.setAttribute("color", new F(g, 3));
    a = new T({
      vertexColors: 2
    });
    Z.call(this, h, a)
  }

  function Jf(e, h,
    a, b, c, d) {
    e = e || 10;
    h = h || 16;
    a = a || 8;
    b = b || 64;
    c = new D(void 0 !== c ? c : 4473924);
    d = new D(void 0 !== d ? d : 8947848);
    var f = [],
      g = [],
      k;
    for (k = 0; k <= h; k++) {
      var m = k / h * 2 * Math.PI;
      var n = Math.sin(m) * e;
      m = Math.cos(m) * e;
      f.push(0, 0, 0);
      f.push(n, 0, m);
      var p = k & 1 ? c : d;
      g.push(p.r, p.g, p.b);
      g.push(p.r, p.g, p.b)
    }
    for (k = 0; k <= a; k++) {
      p = k & 1 ? c : d;
      var l = e - e / a * k;
      for (h = 0; h < b; h++) m = h / b * 2 * Math.PI, n = Math.sin(m) * l, m = Math.cos(m) * l, f.push(n, 0, m), g.push(p.r, p.g, p.b), m = (h + 1) / b * 2 * Math.PI, n = Math.sin(m) * l, m = Math.cos(m) * l, f.push(n, 0, m), g.push(p.r, p.g, p.b)
    }
    e = new G;
    e.setAttribute("position", new F(f, 3));
    e.setAttribute("color", new F(g, 3));
    f = new T({
      vertexColors: 2
    });
    Z.call(this, e, f)
  }

  function yd(e, h, a, b) {
    this.audio = e;
    this.range = h || 1;
    this.divisionsInnerAngle = a || 16;
    this.divisionsOuterAngle = b || 2;
    e = new G;
    h = new Float32Array(3 * (3 * (this.divisionsInnerAngle + 2 * this.divisionsOuterAngle) + 3));
    e.setAttribute("position", new O(h, 3));
    h = new T({
      color: 65280
    });
    a = new T({
      color: 16776960
    });
    pa.call(this, e, [a, h]);
    this.update()
  }

  function Ge(e, h, a, b) {
    this.object = e;
    this.size = void 0 !== h ? h : 1;
    e =
      void 0 !== a ? a : 16776960;
    b = void 0 !== b ? b : 1;
    h = 0;
    (a = this.object.geometry) && a.isGeometry ? h = a.faces.length : console.warn("THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.");
    a = new G;
    h = new F(6 * h, 3);
    a.setAttribute("position", h);
    Z.call(this, a, new T({
      color: e,
      linewidth: b
    }));
    this.matrixAutoUpdate = !1;
    this.update()
  }

  function zd(e, h, a) {
    E.call(this);
    this.light = e;
    this.light.updateMatrixWorld();
    this.matrix = e.matrixWorld;
    this.matrixAutoUpdate = !1;
    this.color = a;
    void 0 === h &&
      (h = 1);
    e = new G;
    e.setAttribute("position", new F([-h, h, 0, h, h, 0, h, -h, 0, -h, -h, 0, -h, h, 0], 3));
    h = new T({
      fog: !1
    });
    this.lightPlane = new pa(e, h);
    this.add(this.lightPlane);
    e = new G;
    e.setAttribute("position", new F([0, 0, 0, 0, 0, 1], 3));
    this.targetLine = new pa(e, h);
    this.add(this.targetLine);
    this.update()
  }

  function He(e) {
    function h(b, c, d) {
      a(b, d);
      a(c, d)
    }

    function a(a, b) {
      d.push(0, 0, 0);
      f.push(b.r, b.g, b.b);
      void 0 === g[a] && (g[a] = []);
      g[a].push(d.length / 3 - 1)
    }
    var b = new G,
      c = new T({
        color: 16777215,
        vertexColors: 1
      }),
      d = [],
      f = [],
      g = {},
      k =
      new D(16755200),
      m = new D(16711680),
      n = new D(43775),
      p = new D(16777215),
      l = new D(3355443);
    h("n1", "n2", k);
    h("n2", "n4", k);
    h("n4", "n3", k);
    h("n3", "n1", k);
    h("f1", "f2", k);
    h("f2", "f4", k);
    h("f4", "f3", k);
    h("f3", "f1", k);
    h("n1", "f1", k);
    h("n2", "f2", k);
    h("n3", "f3", k);
    h("n4", "f4", k);
    h("p", "n1", m);
    h("p", "n2", m);
    h("p", "n3", m);
    h("p", "n4", m);
    h("u1", "u2", n);
    h("u2", "u3", n);
    h("u3", "u1", n);
    h("c", "t", p);
    h("p", "c", l);
    h("cn1", "cn2", l);
    h("cn3", "cn4", l);
    h("cf1", "cf2", l);
    h("cf3", "cf4", l);
    b.setAttribute("position", new F(d, 3));
    b.setAttribute("color",
      new F(f, 3));
    Z.call(this, b, c);
    this.camera = e;
    this.camera.updateProjectionMatrix && this.camera.updateProjectionMatrix();
    this.matrix = e.matrixWorld;
    this.matrixAutoUpdate = !1;
    this.pointMap = g;
    this.update()
  }

  function qa(e, h, a, b, c, d, f) {
    Kf.set(c, d, f).unproject(b);
    e = h[e];
    if (void 0 !== e)
      for (a = a.getAttribute("position"), h = 0, b = e.length; h < b; h++) a.setXYZ(e[h], Kf.x, Kf.y, Kf.z)
  }

  function Ab(e, h) {
    this.object = e;
    void 0 === h && (h = 16776960);
    e = new Uint16Array([0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7]);
    var a = new Float32Array(24),
      b = new G;
    b.setIndex(new O(e, 1));
    b.setAttribute("position", new O(a, 3));
    Z.call(this, b, new T({
      color: h
    }));
    this.matrixAutoUpdate = !1;
    this.update()
  }

  function Ie(e, h) {
    this.type = "Box3Helper";
    this.box = e;
    h = h || 16776960;
    e = new Uint16Array([0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7]);
    var a = new G;
    a.setIndex(new O(e, 1));
    a.setAttribute("position", new F([1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1], 3));
    Z.call(this, a, new T({
      color: h
    }));
    this.geometry.computeBoundingSphere()
  }

  function Je(e, h, a) {
    this.type =
      "PlaneHelper";
    this.plane = e;
    this.size = void 0 === h ? 1 : h;
    e = void 0 !== a ? a : 16776960;
    h = new G;
    h.setAttribute("position", new F([1, -1, 1, -1, 1, 1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0], 3));
    h.computeBoundingSphere();
    pa.call(this, h, new T({
      color: e
    }));
    h = new G;
    h.setAttribute("position", new F([1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, 1, -1, 1], 3));
    h.computeBoundingSphere();
    this.add(new ia(h, new Ia({
      color: e,
      opacity: .2,
      transparent: !0,
      depthWrite: !1
    })))
  }

  function Bb(e, h, a, b, c, d) {
    E.call(this);
    void 0 === e && (e = new q(0,
      0, 1));
    void 0 === h && (h = new q(0, 0, 0));
    void 0 === a && (a = 1);
    void 0 === b && (b = 16776960);
    void 0 === c && (c = .2 * a);
    void 0 === d && (d = .2 * c);
    void 0 === Lf && (Lf = new G, Lf.setAttribute("position", new F([0, 0, 0, 0, 1, 0], 3)), jh = new yb(0, .5, 1, 5, 1), jh.translate(0, -.5, 0));
    this.position.copy(h);
    this.line = new pa(Lf, new T({
      color: b
    }));
    this.line.matrixAutoUpdate = !1;
    this.add(this.line);
    this.cone = new ia(jh, new Ia({
      color: b
    }));
    this.cone.matrixAutoUpdate = !1;
    this.add(this.cone);
    this.setDirection(e);
    this.setLength(a, c, d)
  }

  function Ke(e) {
    e = e ||
      1;
    var h = [0, 0, 0, e, 0, 0, 0, 0, 0, 0, e, 0, 0, 0, 0, 0, 0, e];
    e = new G;
    e.setAttribute("position", new F(h, 3));
    e.setAttribute("color", new F([1, 0, 0, 1, .6, 0, 0, 1, 0, .6, 1, 0, 0, 0, 1, 0, .6, 1], 3));
    h = new T({
      vertexColors: 2
    });
    Z.call(this, e, h)
  }

  function Wi(e) {
    console.warn("THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");
    la.call(this, e);
    this.type = "catmullrom";
    this.closed = !0
  }

  function Xi(e) {
    console.warn("THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");
    la.call(this, e);
    this.type =
      "catmullrom"
  }

  function kh(e) {
    console.warn("THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.");
    la.call(this, e);
    this.type = "catmullrom"
  }
  if (wx.getPerformance) {
    var pl = wx.getSystemInfoSync().platform,
      Mf = wx.getPerformance(),
      ql = Date.parse(new Date()),
      rl = Object.assign({}, Mf, {
        now: function() {
          return (Date.parse(new Date()) - ql) / 1E3
        }
      });
    var sl = "devtools" === pl ? Mf : rl
  }
  var tl = sl,
    lh = wx.getSystemInfoSync(),
    Yi = lh.screenWidth,
    Zi = lh.screenHeight,
    ul = lh.devicePixelRatio,
    Kc = Yi,
    Lc = Zi,
    vl = {
      width: Yi,
      height: Zi,
      availWidth: Kc,
      availHeight: Lc,
      availLeft: 0,
      availTop: 0
    },
    Le = new WeakMap,
    mh = function() {
      function e() {
        fb(this, e);
        Le.set(this, {})
      }
      Ve(e, [{
          key: "addEventListener",
          value: function(e, a) {
            var b = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : {},
              c = Le.get(this);
            c || (c = {}, Le.set(this, c));
            c[e] || (c[e] = []);
            c[e].push(a);
            b.capture && console.warn("EventTarget.addEventListener: options.capture is not implemented.");
            b.once && console.warn("EventTarget.addEventListener: options.once is not implemented.");
            b.passive && console.warn("EventTarget.addEventListener: options.passive is not implemented.")
          }
        },
        {
          key: "removeEventListener",
          value: function(e, a) {
            var b = Le.get(this);
            if (b && (e = b[e]) && 0 < e.length)
              for (b = e.length; b--; 0 < b)
                if (e[b] === a) {
                  e.splice(b, 1);
                  break
                }
          }
        }, {
          key: "dispatchEvent",
          value: function() {
            var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {},
              a = Le.get(this)[e.type];
            if (a)
              for (var b = 0; b < a.length; b++) a[b](e)
          }
        }
      ]);
      return e
    }(),
    $i = function(e) {
      function h() {
        fb(this, h);
        var a = Xb(this, sb(h).call(this));
        a.className = "";
        a.children = [];
        return a
      }
      Wb(h, e);
      Ve(h, [{
        key: "setAttribute",
        value: function(a, b) {
          this[a] =
            b
        }
      }, {
        key: "getAttribute",
        value: function(a) {
          return this[a]
        }
      }, {
        key: "setAttributeNS",
        value: function(a, b) {
          this[a] = b
        }
      }, {
        key: "getAttributeNS",
        value: function(a) {
          return this[a]
        }
      }]);
      return h
    }(function(e) {
      function h() {
        fb(this, h);
        var a = Xb(this, sb(h).call(this));
        a.childNodes = [];
        return a
      }
      Wb(h, e);
      Ve(h, [{
          key: "appendChild",
          value: function(a) {
            this.childNodes.push(a);
            if (a instanceof h) this.childNodes.push(a);
            else throw new TypeError("Failed to executed 'appendChild' on 'Node': parameter 1 is not of type 'Node'.");
          }
        },
        {
          key: "cloneNode",
          value: function() {
            var a = Object.create(this);
            Object.assign(a, this);
            return a
          }
        }, {
          key: "removeChild",
          value: function(a) {
            var b = this.childNodes.findIndex(function(b) {
              return b === a
            });
            return -1 < b ? this.childNodes.splice(b, 1) : null
          }
        }
      ]);
      return h
    }(mh)),
    zc = function(e) {
      function h() {
        var a = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : "",
          b = 1 < arguments.length ? arguments[1] : void 0;
        fb(this, h);
        var c = Xb(this, sb(h).call(this));
        c.className = "";
        c.children = [];
        c.focus = fa;
        c.blur = fa;
        c.insertBefore = fa;
        c.appendChild =
          fa;
        c.removeChild = fa;
        c.remove = fa;
        c.innerHTML = "";
        c.tagName = a.toUpperCase();
        Ph(tb(c), b);
        a = tb(c);
        a.style = a.style || {};
        Object.assign(a.style, {
          top: "0px",
          left: "0px",
          width: Kc + "px",
          height: Lc + "px",
          margin: "0px",
          padding: "0px"
        });
        Qh(tb(c));
        Nj(tb(c));
        a = tb(c);
        "offsetLeft" in a || (a.offsetLeft = 0, a.offsetTop = 0);
        "offsetWidth" in a || (a.offsetWidth = Kc, a.offsetHeight = Lc);
        a = tb(c);
        "scrollLeft" in a || (a.scrollLeft = 0, a.scrollTop = 0);
        "scrollWidth" in a || (a.scrollWidth = Kc, a.scrollHeight = Lc);
        return c
      }
      Wb(h, e);
      return h
    }($i),
    ra = null,
    ma =
    new Map,
    nh = {
      0: "animation-delay",
      1: "animation-direction",
      2: "animation-duration",
      3: "animation-fill-mode",
      4: "animation-iteration-count",
      5: "animation-name",
      6: "animation-play-state",
      7: "animation-timing-function",
      8: "background-attachment",
      9: "background-blend-mode",
      10: "background-clip",
      11: "background-color",
      12: "background-image",
      13: "background-origin",
      14: "background-position",
      15: "background-repeat",
      16: "background-size",
      17: "border-bottom-color",
      18: "border-bottom-left-radius",
      19: "border-bottom-right-radius",
      20: "border-bottom-style",
      21: "border-bottom-width",
      22: "border-collapse",
      23: "border-image-outset",
      24: "border-image-repeat",
      25: "border-image-slice",
      26: "border-image-source",
      27: "border-image-width",
      28: "border-left-color",
      29: "border-left-style",
      30: "border-left-width",
      31: "border-right-color",
      32: "border-right-style",
      33: "border-right-width",
      34: "border-top-color",
      35: "border-top-left-radius",
      36: "border-top-right-radius",
      37: "border-top-style",
      38: "border-top-width",
      39: "bottom",
      40: "box-shadow",
      41: "box-sizing",
      42: "break-after",
      43: "break-before",
      44: "break-inside",
      45: "caption-side",
      46: "clear",
      47: "clip",
      48: "color",
      49: "content",
      50: "cursor",
      51: "direction",
      52: "display",
      53: "empty-cells",
      54: "float",
      55: "font-family",
      56: "font-kerning",
      57: "font-size",
      58: "font-stretch",
      59: "font-style",
      60: "font-variant",
      61: "font-variant-ligatures",
      62: "font-variant-caps",
      63: "font-variant-numeric",
      64: "font-variant-east-asian",
      65: "font-weight",
      66: "height",
      67: "image-rendering",
      68: "isolation",
      69: "justify-items",
      70: "justify-self",
      71: "left",
      72: "letter-spacing",
      73: "line-height",
      74: "list-style-image",
      75: "list-style-position",
      76: "list-style-type",
      77: "margin-bottom",
      78: "margin-left",
      79: "margin-right",
      80: "margin-top",
      81: "max-height",
      82: "max-width",
      83: "min-height",
      84: "min-width",
      85: "mix-blend-mode",
      86: "object-fit",
      87: "object-position",
      88: "offset-distance",
      89: "offset-path",
      90: "offset-rotate",
      91: "opacity",
      92: "orphans",
      93: "outline-color",
      94: "outline-offset",
      95: "outline-style",
      96: "outline-width",
      97: "overflow-anchor",
      98: "overflow-wrap",
      99: "overflow-x",
      100: "overflow-y",
      101: "padding-bottom",
      102: "padding-left",
      103: "padding-right",
      104: "padding-top",
      105: "pointer-events",
      106: "position",
      107: "resize",
      108: "right",
      109: "scroll-behavior",
      110: "speak",
      111: "table-layout",
      112: "tab-size",
      113: "text-align",
      114: "text-align-last",
      115: "text-decoration",
      116: "text-decoration-line",
      117: "text-decoration-style",
      118: "text-decoration-color",
      119: "text-decoration-skip-ink",
      120: "text-underline-position",
      121: "text-indent",
      122: "text-rendering",
      123: "text-shadow",
      124: "text-size-adjust",
      125: "text-overflow",
      126: "text-transform",
      127: "top",
      128: "touch-action",
      129: "transition-delay",
      130: "transition-duration",
      131: "transition-property",
      132: "transition-timing-function",
      133: "unicode-bidi",
      134: "vertical-align",
      135: "visibility",
      136: "white-space",
      137: "widows",
      138: "width",
      139: "will-change",
      140: "word-break",
      141: "word-spacing",
      142: "word-wrap",
      143: "z-index",
      144: "zoom",
      145: "-webkit-appearance",
      146: "backface-visibility",
      147: "-webkit-border-horizontal-spacing",
      148: "-webkit-border-image",
      149: "-webkit-border-vertical-spacing",
      150: "-webkit-box-align",
      151: "-webkit-box-decoration-break",
      152: "-webkit-box-direction",
      153: "-webkit-box-flex",
      154: "-webkit-box-flex-group",
      155: "-webkit-box-lines",
      156: "-webkit-box-ordinal-group",
      157: "-webkit-box-orient",
      158: "-webkit-box-pack",
      159: "-webkit-box-reflect",
      160: "column-count",
      161: "column-gap",
      162: "column-rule-color",
      163: "column-rule-style",
      164: "column-rule-width",
      165: "column-span",
      166: "column-width",
      167: "align-content",
      168: "align-items",
      169: "align-self",
      170: "flex-basis",
      171: "flex-grow",
      172: "flex-shrink",
      173: "flex-direction",
      174: "flex-wrap",
      175: "justify-content",
      176: "-webkit-font-smoothing",
      177: "grid-auto-columns",
      178: "grid-auto-flow",
      179: "grid-auto-rows",
      180: "grid-column-end",
      181: "grid-column-start",
      182: "grid-template-areas",
      183: "grid-template-columns",
      184: "grid-template-rows",
      185: "grid-row-end",
      186: "grid-row-start",
      187: "grid-column-gap",
      188: "grid-row-gap",
      189: "-webkit-highlight",
      190: "hyphens",
      191: "-webkit-hyphenate-character",
      192: "-webkit-line-break",
      193: "-webkit-line-clamp",
      194: "-webkit-locale",
      195: "-webkit-margin-before-collapse",
      196: "-webkit-margin-after-collapse",
      197: "-webkit-mask-box-image",
      198: "-webkit-mask-box-image-outset",
      199: "-webkit-mask-box-image-repeat",
      200: "-webkit-mask-box-image-slice",
      201: "-webkit-mask-box-image-source",
      202: "-webkit-mask-box-image-width",
      203: "-webkit-mask-clip",
      204: "-webkit-mask-composite",
      205: "-webkit-mask-image",
      206: "-webkit-mask-origin",
      207: "-webkit-mask-position",
      208: "-webkit-mask-repeat",
      209: "-webkit-mask-size",
      210: "order",
      211: "perspective",
      212: "perspective-origin",
      213: "-webkit-print-color-adjust",
      214: "-webkit-rtl-ordering",
      215: "shape-outside",
      216: "shape-image-threshold",
      217: "shape-margin",
      218: "-webkit-tap-highlight-color",
      219: "-webkit-text-combine",
      220: "-webkit-text-decorations-in-effect",
      221: "-webkit-text-emphasis-color",
      222: "-webkit-text-emphasis-position",
      223: "-webkit-text-emphasis-style",
      224: "-webkit-text-fill-color",
      225: "-webkit-text-orientation",
      226: "-webkit-text-security",
      227: "-webkit-text-stroke-color",
      228: "-webkit-text-stroke-width",
      229: "transform",
      230: "transform-origin",
      231: "transform-style",
      232: "-webkit-user-drag",
      233: "-webkit-user-modify",
      234: "user-select",
      235: "-webkit-writing-mode",
      236: "-webkit-app-region",
      237: "buffered-rendering",
      238: "clip-path",
      239: "clip-rule",
      240: "mask",
      241: "filter",
      242: "flood-color",
      243: "flood-opacity",
      244: "lighting-color",
      245: "stop-color",
      246: "stop-opacity",
      247: "color-interpolation",
      248: "color-interpolation-filters",
      249: "color-rendering",
      250: "fill",
      251: "fill-opacity",
      252: "fill-rule",
      253: "marker-end",
      254: "marker-mid",
      255: "marker-start",
      256: "mask-type",
      257: "shape-rendering",
      258: "stroke",
      259: "stroke-dasharray",
      260: "stroke-dashoffset",
      261: "stroke-linecap",
      262: "stroke-linejoin",
      263: "stroke-miterlimit",
      264: "stroke-opacity",
      265: "stroke-width",
      266: "alignment-baseline",
      267: "baseline-shift",
      268: "dominant-baseline",
      269: "text-anchor",
      270: "writing-mode",
      271: "vector-effect",
      272: "paint-order",
      273: "d",
      274: "cx",
      275: "cy",
      276: "x",
      277: "y",
      278: "r",
      279: "rx",
      280: "ry",
      281: "caret-color",
      282: "line-break",
      display: "inline",
      dominantBaseline: "auto",
      emptyCells: "show",
      fill: "rgb(0, 0, 0)",
      fillOpacity: "1",
      fillRule: "nonzero",
      filter: "none",
      flex: "0 1 auto",
      flexBasis: "auto",
      flexDirection: "row",
      flexFlow: "row nowrap",
      flexGrow: "0",
      flexShrink: "1",
      flexWrap: "nowrap",
      "float": "none",
      floodColor: "rgb(0, 0, 0)",
      floodOpacity: "1",
      font: 'normal normal 400 normal 16px / normal "PingFang SC"',
      fontDisplay: "",
      fontFamily: '"PingFang SC"',
      fontFeatureSettings: "normal",
      fontKerning: "auto",
      fontSize: "16px",
      fontStretch: "100%",
      fontStyle: "normal",
      fontVariant: "normal",
      fontVariantCaps: "normal",
      fontVariantEastAsian: "normal",
      fontVariantLigatures: "normal",
      fontVariantNumeric: "normal",
      fontVariationSettings: "normal",
      fontWeight: "400",
      grid: "none / none / none / row / auto / auto",
      gridArea: "auto / auto / auto / auto",
      gridAutoColumns: "auto",
      gridAutoFlow: "row",
      gridAutoRows: "auto",
      gridColumn: "auto / auto",
      gridColumnEnd: "auto",
      gridColumnGap: "0px",
      gridColumnStart: "auto",
      gridGap: "0px 0px",
      gridRow: "auto / auto",
      gridRowEnd: "auto",
      gridRowGap: "0px",
      gridRowStart: "auto",
      gridTemplate: "none / none / none",
      gridTemplateAreas: "none",
      gridTemplateColumns: "none",
      gridTemplateRows: "none",
      height: "0px",
      hyphens: "manual",
      imageRendering: "auto",
      inlineSize: "0px",
      isolation: "auto",
      justifyContent: "normal",
      justifyItems: "normal",
      justifySelf: "auto",
      left: "auto",
      letterSpacing: "normal",
      lightingColor: "rgb(255, 255, 255)",
      lineBreak: "auto",
      lineHeight: "normal",
      listStyle: "disc outside none",
      listStyleImage: "none",
      listStylePosition: "outside",
      listStyleType: "disc",
      margin: "0px",
      marginBottom: "0px",
      marginLeft: "0px",
      marginRight: "0px",
      marginTop: "0px",
      marker: "",
      markerEnd: "none",
      markerMid: "none",
      markerStart: "none",
      mask: "none",
      maskType: "luminance",
      maxBlockSize: "none",
      maxHeight: "none",
      maxInlineSize: "none",
      maxWidth: "none",
      maxZoom: "",
      minBlockSize: "0px",
      minHeight: "0px",
      minInlineSize: "0px",
      minWidth: "0px",
      minZoom: "",
      mixBlendMode: "normal",
      objectFit: "fill",
      objectPosition: "50% 50%",
      offset: "none 0px auto 0deg",
      offsetDistance: "0px",
      offsetPath: "none",
      offsetRotate: "auto 0deg",
      opacity: "1",
      order: "0",
      orientation: "",
      orphans: "2",
      outline: "rgb(0, 0, 0) none 0px",
      outlineColor: "rgb(0, 0, 0)",
      outlineOffset: "0px",
      outlineStyle: "none",
      outlineWidth: "0px",
      overflow: "visible",
      overflowAnchor: "auto",
      overflowWrap: "normal",
      overflowX: "visible",
      overflowY: "visible",
      overscrollBehavior: "auto auto",
      overscrollBehaviorX: "auto",
      overscrollBehaviorY: "auto",
      padding: "0px",
      paddingBottom: "0px",
      paddingLeft: "0px",
      paddingRight: "0px",
      paddingTop: "0px",
      page: "",
      pageBreakAfter: "auto",
      pageBreakBefore: "auto",
      pageBreakInside: "auto",
      paintOrder: "fill stroke markers",
      perspective: "none",
      perspectiveOrigin: "0px 0px",
      placeContent: "normal normal",
      placeItems: "normal normal",
      placeSelf: "auto auto",
      pointerEvents: "auto",
      position: "static",
      quotes: "",
      r: "0px",
      resize: "none",
      right: "auto",
      rx: "auto",
      ry: "auto",
      scrollBehavior: "auto",
      shapeImageThreshold: "0",
      shapeMargin: "0px",
      shapeOutside: "none",
      shapeRendering: "auto",
      size: "",
      speak: "normal",
      src: "",
      stopColor: "rgb(0, 0, 0)",
      stopOpacity: "1",
      stroke: "none",
      strokeDasharray: "none",
      strokeDashoffset: "0px",
      strokeLinecap: "butt",
      strokeLinejoin: "miter",
      strokeMiterlimit: "4",
      strokeOpacity: "1",
      strokeWidth: "1px",
      tabSize: "8",
      tableLayout: "auto",
      textAlign: "start",
      textAlignLast: "auto",
      textAnchor: "start",
      textCombineUpright: "none",
      textDecoration: "none solid rgb(0, 0, 0)",
      textDecorationColor: "rgb(0, 0, 0)",
      textDecorationLine: "none",
      textDecorationSkipInk: "auto",
      textDecorationStyle: "solid",
      textIndent: "0px",
      textOrientation: "mixed",
      textOverflow: "clip",
      textRendering: "auto",
      textShadow: "none",
      textSizeAdjust: "auto",
      textTransform: "none",
      textUnderlinePosition: "auto",
      top: "auto",
      touchAction: "auto",
      transform: "none",
      transformBox: "view-box",
      transformOrigin: "0px 0px",
      transformStyle: "flat",
      transition: "all 0s ease 0s",
      transitionDelay: "0s",
      transitionDuration: "0s",
      transitionProperty: "all",
      transitionTimingFunction: "ease",
      unicodeBidi: "normal",
      unicodeRange: "",
      userSelect: "auto",
      userZoom: "",
      vectorEffect: "none",
      verticalAlign: "baseline",
      visibility: "visible",
      webkitAppRegion: "no-drag",
      webkitAppearance: "none",
      webkitBorderAfter: "0px none rgb(0, 0, 0)",
      webkitBorderAfterColor: "rgb(0, 0, 0)",
      webkitBorderAfterStyle: "none",
      webkitBorderAfterWidth: "0px",
      webkitBorderBefore: "0px none rgb(0, 0, 0)",
      webkitBorderBeforeColor: "rgb(0, 0, 0)",
      webkitBorderBeforeStyle: "none",
      webkitBorderBeforeWidth: "0px",
      webkitBorderEnd: "0px none rgb(0, 0, 0)",
      webkitBorderEndColor: "rgb(0, 0, 0)",
      webkitBorderEndStyle: "none",
      webkitBorderEndWidth: "0px",
      webkitBorderHorizontalSpacing: "0px",
      webkitBorderImage: "none",
      webkitBorderStart: "0px none rgb(0, 0, 0)",
      webkitBorderStartColor: "rgb(0, 0, 0)",
      webkitBorderStartStyle: "none",
      webkitBorderStartWidth: "0px",
      webkitBorderVerticalSpacing: "0px",
      webkitBoxAlign: "stretch",
      webkitBoxDecorationBreak: "slice",
      webkitBoxDirection: "normal",
      webkitBoxFlex: "0",
      webkitBoxFlexGroup: "1",
      webkitBoxLines: "single",
      webkitBoxOrdinalGroup: "1",
      webkitBoxOrient: "horizontal",
      webkitBoxPack: "start",
      webkitBoxReflect: "none",
      webkitColumnBreakAfter: "auto",
      webkitColumnBreakBefore: "auto",
      webkitColumnBreakInside: "auto",
      webkitFontSizeDelta: "",
      webkitFontSmoothing: "auto",
      webkitHighlight: "none",
      webkitHyphenateCharacter: "auto",
      webkitLineBreak: "auto",
      webkitLineClamp: "none",
      webkitLocale: "auto",
      webkitLogicalHeight: "0px",
      webkitLogicalWidth: "0px",
      webkitMarginAfter: "0px",
      webkitMarginAfterCollapse: "collapse",
      webkitMarginBefore: "0px",
      webkitMarginBeforeCollapse: "collapse",
      webkitMarginBottomCollapse: "collapse",
      webkitMarginCollapse: "",
      webkitMarginEnd: "0px",
      webkitMarginStart: "0px",
      webkitMarginTopCollapse: "collapse",
      webkitMask: "",
      webkitMaskBoxImage: "none",
      webkitMaskBoxImageOutset: "0px",
      webkitMaskBoxImageRepeat: "stretch",
      webkitMaskBoxImageSlice: "0 fill",
      webkitMaskBoxImageSource: "none",
      webkitMaskBoxImageWidth: "auto",
      webkitMaskClip: "border-box",
      webkitMaskComposite: "source-over",
      webkitMaskImage: "none",
      webkitMaskOrigin: "border-box",
      webkitMaskPosition: "0% 0%",
      webkitMaskPositionX: "0%",
      webkitMaskPositionY: "0%",
      webkitMaskRepeat: "repeat",
      webkitMaskRepeatX: "",
      webkitMaskRepeatY: "",
      webkitMaskSize: "auto",
      webkitMaxLogicalHeight: "none",
      webkitMaxLogicalWidth: "none",
      webkitMinLogicalHeight: "0px",
      webkitMinLogicalWidth: "0px",
      webkitPaddingAfter: "0px",
      webkitPaddingBefore: "0px",
      webkitPaddingEnd: "0px",
      webkitPaddingStart: "0px",
      webkitPerspectiveOriginX: "",
      webkitPerspectiveOriginY: "",
      webkitPrintColorAdjust: "economy",
      webkitRtlOrdering: "logical",
      webkitRubyPosition: "before",
      webkitTapHighlightColor: "rgba(0, 0, 0, 0.4)",
      webkitTextCombine: "none",
      webkitTextDecorationsInEffect: "none",
      webkitTextEmphasis: "",
      webkitTextEmphasisColor: "rgb(0, 0, 0)",
      webkitTextEmphasisPosition: "over right",
      webkitTextEmphasisStyle: "none",
      webkitTextFillColor: "rgb(0, 0, 0)",
      webkitTextOrientation: "vertical-right",
      webkitTextSecurity: "none",
      webkitTextStroke: "",
      webkitTextStrokeColor: "rgb(0, 0, 0)",
      webkitTextStrokeWidth: "0px",
      webkitTransformOriginX: "",
      webkitTransformOriginY: "",
      webkitTransformOriginZ: "",
      webkitUserDrag: "auto",
      webkitUserModify: "read-only",
      webkitWritingMode: "horizontal-tb",
      whiteSpace: "normal",
      widows: "2",
      width: "0px",
      willChange: "auto",
      wordBreak: "normal",
      wordSpacing: "0px",
      wordWrap: "normal",
      writingMode: "horizontal-tb",
      x: "0px",
      y: "0px",
      zIndex: "auto",
      zoom: "1"
    },
    pg = function a(h) {
      fb(this, a);
      this.cancelable = this.cancelBubble = !1;
      this.currentTarget = this.target = null;
      this.stopPropagation = this.preventDefault = fa;
      this.type = h;
      this.timeStamp = Date.now()
    },
    aj = {
      href: "app.js",
      reload: function() {},
      replace: function(h) {
        this.href = h
      }
    },
    wl = function(h) {
      function a() {
        fb(this, a);
        return Xb(this, sb(a).call(this, "html", 0))
      }
      Wb(a, h);
      return a
    }(zc),
    xl = function(h) {
      function a() {
        fb(this, a);
        return Xb(this, sb(a).call(this, "body", 0))
      }
      Wb(a, h);
      return a
    }(zc),
    bj = function(h) {
      function a(b) {
        fb(this, a);
        b = Xb(this, sb(a).call(this, b));
        b.touches = [];
        b.targetTouches = [];
        b.changedTouches = [];
        b.target = null;
        b.currentTarget = null;
        return b
      }
      Wb(a, h);
      return a
    }(pg),
    oh = function b(a) {
      fb(this, b);
      this.identifier =
        a.identifier;
      this.force = void 0 === a.force ? 1 : a.force;
      this.pageX = a.pageX || a.x;
      this.pageY = a.pageY || a.y;
      this.clientX = a.clientX || a.x;
      this.clientY = a.clientY || a.y;
      this.screenX = this.pageX;
      this.screenY = this.pageY
    },
    Me = {},
    V = {
      readyState: "complete",
      visibilityState: "visible",
      hidden: !1,
      fullscreen: !0,
      location: aj,
      scripts: [],
      style: {},
      ontouchstart: null,
      ontouchmove: null,
      ontouchend: null,
      onvisibilitychange: null,
      parentNode: null,
      parentElement: null,
      createElement: function(a) {
        a = a.toLowerCase();
        if ("canvas" === a) {
          if (null == ra) throw Error("please register a canvas");
          return ra
        }
        return "img" === a ? new Rh : new zc(a)
      },
      createElementNS: function(a, b) {
        return this.createElement(b)
      },
      createTextNode: function(a) {
        return a
      },
      getElementById: function(a) {
        return ma.has(a) ? ma.get(a) : null
      },
      getElementsByTagName: function(a) {
        a = a.toLowerCase();
        return "head" === a ? [V.head] : "body" === a ? [V.body] : "canvas" === a ? ng(ma) : []
      },
      getElementsByTagNameNS: function(a, b) {
        return this.getElementsByTagName(b)
      },
      getElementsByName: function(a) {
        return "head" === a ? [V.head] : "body" === a ? [V.body] : "canvas" === a ? ng(ma) : []
      },
      querySelector: function(a) {
        if ("head" ===
          a) return V.head;
        if ("body" === a) return V.body;
        if ("canvas" === a) return ra;
        a = a.slice(1);
        return ma.has(a) ? ma.get(a) : null
      },
      querySelectorAll: function(a) {
        return "head" === a ? [V.head] : "body" === a ? [V.body] : "canvas" === a ? ng(ma) : []
      },
      addEventListener: function(a, b) {
        Me[a] || (Me[a] = []);
        Me[a].push(b)
      },
      removeEventListener: function(a, b) {
        if ((a = Me[a]) && 0 < a.length)
          for (var c = a.length; c--; 0 < c)
            if (a[c] === b) {
              a.splice(c, 1);
              break
            }
      },
      dispatchEvent: function(a) {
        var b = a.type,
          c = Me[b];
        if (c)
          for (var d = 0; d < c.length; d++) c[d](a);
        if (a.target && "function" ===
          typeof a.target["on" + b]) a.target["on" + b](a)
      }
    };
  V.documentElement = new wl;
  V.head = new zc("head");
  V.body = new xl;
  if (wx.onHide) wx.onHide(Sh(!1));
  if (wx.onShow) wx.onShow(Sh(!0));
  var ph = wx.getSystemInfoSync(),
    yl = ph.platform,
    cj = ph.language,
    dj = -1 !== ph.system.toLowerCase().indexOf("android") ? "Android; CPU Android 6.0" : "iPhone; CPU iPhone OS 10_3_1 like Mac OS X",
    zl = "Mozilla/5.0 (".concat(dj, ") AppleWebKit/603.1.30 (KHTML, like Gecko) Mobile/14E8301 MicroMessenger/6.6.0 MiniGame NetType/WIFI Language/").concat(cj),
    ej = {
      platform: yl,
      language: cj,
      appVersion: "5.0 (".concat(dj, ") AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1"),
      userAgent: zl,
      onLine: !0,
      geolocation: {
        getCurrentPosition: fa,
        watchPosition: fa,
        clearWatch: fa
      }
    };
  if (wx.onNetworkStatusChange) wx.onNetworkStatusChange(function(a) {
    ej.onLine = a.isConnected
  });
  var Nf = new WeakMap,
    Of = new WeakMap,
    Al = new WeakMap,
    Ac = function(a) {
      function b() {
        fb(this, b);
        var a = Xb(this, sb(b).call(this));
        a.onabort = null;
        a.onerror = null;
        a.onload = null;
        a.onloadstart =
          null;
        a.onprogress = null;
        a.ontimeout = null;
        a.onloadend = null;
        a.onreadystatechange = null;
        a.readyState = 0;
        a.response = null;
        a.responseText = null;
        a.responseType = "text";
        a.dataType = "string";
        a.responseXML = null;
        a.status = 0;
        a.statusText = "";
        a.upload = {};
        a.withCredentials = !1;
        Nf.set(tb(a), {
          "content-type": "application/x-www-form-urlencoded"
        });
        Of.set(tb(a), {});
        return a
      }
      Wb(b, a);
      Ve(b, [{
        key: "abort",
        value: function() {
          var a = Al.get(this);
          a && a.abort()
        }
      }, {
        key: "getAllResponseHeaders",
        value: function() {
          var a = Of.get(this);
          return Object.keys(a).map(function(b) {
            return "".concat(b,
              ": ").concat(a[b])
          }).join("\n")
        }
      }, {
        key: "getResponseHeader",
        value: function(a) {
          return Of.get(this)[a]
        }
      }, {
        key: "open",
        value: function(a, d) {
          this._method = a;
          this._url = d;
          We.call(this, b.OPENED)
        }
      }, {
        key: "overrideMimeType",
        value: function() {}
      }, {
        key: "send",
        value: function() {
          var a = this,
            d = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : "";
          if (this.readyState !== b.OPENED) throw Error("Failed to execute 'send' on 'XMLHttpRequest': The object's state must be OPENED.");
          var f = this._url,
            g = Nf.get(this),
            k = this.responseType,
            m = this.dataType,
            n = !/^(http|https|ftp|wxfile):\/\/.*/i.test(f),
            p;
          "arraybuffer" !== k && (p = "utf8");
          delete this.response;
          this.response = null;
          var l = function(c) {
              var d = c.data,
                f = c.statusCode;
              c = c.header;
              f = void 0 === f ? 200 : f;
              if ("string" !== typeof d && !(d instanceof ArrayBuffer)) try {
                d = JSON.stringify(d)
              } catch (w) {}
              a.status = f;
              c && Of.set(a, c);
              Yb.call(a, "loadstart");
              We.call(a, b.HEADERS_RECEIVED);
              We.call(a, b.LOADING);
              a.response = d;
              d instanceof ArrayBuffer ? Object.defineProperty(a, "responseText", {
                enumerable: !0,
                configurable: !0,
                get: function() {
                  throw "InvalidStateError : responseType is " + this.responseType;
                }
              }) : a.responseText = d;
              We.call(a, b.DONE);
              Yb.call(a, "load");
              Yb.call(a, "loadend")
            },
            t = function(b) {
              b = b.errMsg; - 1 !== b.indexOf("abort") ? Yb.call(a, "abort") : Yb.call(a, "error", {
                message: b
              });
              Yb.call(a, "loadend");
              n && console.warn(b)
            };
          n ? (d = wx.getFileSystemManager(), f = {
            filePath: f,
            success: l,
            fail: t
          }, p && (f.encoding = p), d.readFile(f)) : wx.request({
            data: d,
            url: f,
            method: this._method,
            header: g,
            dataType: m,
            responseType: k,
            success: l,
            fail: t
          })
        }
      }, {
        key: "setRequestHeader",
        value: function(a, b) {
          var c = Nf.get(this);
          c[a] = b;
          Nf.set(this, c)
        }
      }, {
        key: "addEventListener",
        value: function(a, b) {
          var c = this;
          "function" === typeof b && (this["on" + a] = function() {
            var a = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {};
            a.target = a.target || c;
            b.call(c, a)
          })
        }
      }, {
        key: "removeEventListener",
        value: function(a, b) {
          this["on" + a] === b && (this["on" + a] = null)
        }
      }]);
      return b
    }(mh);
  Ac.UNSEND = 0;
  Ac.OPENED = 1;
  Ac.HEADERS_RECEIVED = 2;
  Ac.LOADING = 3;
  Ac.DONE = 4;
  if ("devtools" !== wx.getSystemInfoSync().platform) {
    var fj = wx.getPerformance ?
      wx.getPerformance() : Date,
      qh = {};
    console.time = function(a) {
      qh[a] = fj.now()
    };
    console.timeEnd = function(a) {
      var b = qh[a];
      b && (b = fj.now() - b, console.log(a + ": " + b / 1E3 + "ms"), delete qh[a])
    }
  }
  if (wx.onWindowResize) wx.onWindowResize(function(a) {
    var b = new pg("resize");
    b.target = V;
    b.timeStamp = Date.now();
    b.res = a;
    b.windowWidth = a.windowWidth;
    b.windowHeight = a.windowHeight;
    V.dispatchEvent(b)
  });
  var kc = Object.freeze({
    __proto__: null,
    AudioContext: null,
    Element: $i,
    HTMLElement: zc,
    Image: Rh,
    TouchEvent: bj,
    VRFrameData: fa,
    XMLHttpRequest: Ac,
    _canvasMap: ma,
    addEventListener: Th,
    alert: function(a) {
      console.log(a)
    },
    arrayBufferToBase64: wx.arrayBufferToBase64 || fa,
    base64ToArrayBuffer: wx.base64ToArrayBuffer || fa,
    blur: function() {},
    cancelAnimationFrame: ra ? ra.cancelAnimationFrame : fa,
    get canvas() {
      return ra
    },
    clearCanvas: function() {
      ma.clear();
      ra = null
    },
    devicePixelRatio: ul,
    document: V,
    focus: function() {},
    getComputedStyle: function(a) {
      var b = a.tagName;
      return "CANVAS" === b ? (a = a.getBoundingClientRect(), Object.assign(nh, {
        display: "inline",
        position: "static",
        inlineSize: a.width +
          "px",
        perspectiveOrigin: a.width / 2 + "px " + a.height / 2 + "px",
        transformOrigin: a.width / 2 + "px " + a.height / 2 + "px",
        webkitLogicalWidth: a.width + "px",
        webkitLogicalHeight: a.height + "px",
        width: a.width + "px",
        height: a.height + "px"
      })) : "IMG" === b ? (b = a.width, a = a.height, Object.assign(nh, {
        display: "inline",
        position: "static",
        inlineSize: b + "px",
        perspectiveOrigin: b / 2 + "px " + a / 2 + "px",
        transformOrigin: b / 2 + "px " + a / 2 + "px",
        webkitLogicalWidth: b + "px",
        webkitLogicalHeight: a + "px",
        width: b + "px",
        height: a + "px"
      })) : nh
    },
    innerHeight: Lc,
    innerWidth: Kc,
    location: aj,
    navigator: ej,
    ontouchend: null,
    ontouchmove: null,
    ontouchstart: null,
    performance: tl,
    registerCanvas: function() {
      for (var a = null, b = null, c = arguments.length, d = Array(c), f = 0; f < c; f++) d[f] = arguments[f];
      if (0 === d.length) throw Error("need arguments");
      1 === d.length && d[0]._canvasId ? (b = d[0], a = d[0]._canvasId) : 2 === d.length && "string" === typeof d[0] && d[1]._canvasId && (a = d[0], b = d[1]);
      if (!a || !b) throw Error("parameter err");
      if (5 <= ma.size && (console.warn("canvas map size bigger 5 please remove unused canvas!"), c = ma.keys().next().value)) ma["delete"](c);
      ma.has(a) ? ra = ma.get(a) : (b.type = "canvas", c = new zc("canvas"), og(b, c), og(b.constructor.prototype, mh.prototype), og(b.constructor.prototype, zc.prototype), ma.set(a, b), ra = b);
      return ra
    },
    removeEventListener: Uh,
    requestAnimationFrame: ra ? ra.requestAnimationFrame : fa,
    screen: vl,
    scrollBy: function(a, b) {},
    scrollTo: function(a, b) {},
    scrollX: 0,
    scrollY: 0,
    touchEventHandlerFactory: function(a, b) {
      return function(c) {
        var d = new bj(b);
        d.changedTouches = c.changedTouches.map(function(a) {
          return new oh(a)
        });
        d.touches = c.touches.map(function(a) {
          return new oh(a)
        });
        d.targetTouches = Array.prototype.slice.call(c.touches.map(function(a) {
          return new oh(a)
        }));
        d.timeStamp = c.timeStamp;
        "document" == a ? (d.target = V, d.currentTarget = V, V.dispatchEvent(d)) : (d.target = ra, d.currentTarget = ra, ra.dispatchEvent(d))
      }
    },
    unregisterCanvas: function(a) {
      if (!a) throw Error("need arguments");
      if ("string" === typeof a) return ma["delete"](a);
      if (a._canvasId) return ma["delete"](a._canvasId);
      ra = null;
      return !1
    },
    webkitAudioContext: null
  });
  void 0 === Number.EPSILON && (Number.EPSILON = Math.pow(2, -52));
  void 0 ===
    Number.isInteger && (Number.isInteger = function(a) {
      return "number" === typeof a && isFinite(a) && Math.floor(a) === a
    });
  void 0 === Math.sign && (Math.sign = function(a) {
    return 0 > a ? -1 : 0 < a ? 1 : +a
  });
  !1 === "name" in Function.prototype && Object.defineProperty(Function.prototype, "name", {
    get: function() {
      return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1]
    }
  });
  void 0 === Object.assign && (Object.assign = function(a) {
    if (void 0 === a || null === a) throw new TypeError("Cannot convert undefined or null to object");
    for (var b = Object(a), c =
        1; c < arguments.length; c++) {
      var d = arguments[c];
      if (void 0 !== d && null !== d)
        for (var f in d) Object.prototype.hasOwnProperty.call(d, f) && (b[f] = d[f])
    }
    return b
  });
  Object.assign(Ra.prototype, {
    addEventListener: function(a, b) {
      void 0 === this._listeners && (this._listeners = {});
      var c = this._listeners;
      void 0 === c[a] && (c[a] = []); - 1 === c[a].indexOf(b) && c[a].push(b)
    },
    hasEventListener: function(a, b) {
      if (void 0 === this._listeners) return !1;
      var c = this._listeners;
      return void 0 !== c[a] && -1 !== c[a].indexOf(b)
    },
    removeEventListener: function(a,
      b) {
      void 0 !== this._listeners && (a = this._listeners[a], void 0 !== a && (b = a.indexOf(b), -1 !== b && a.splice(b, 1)))
    },
    dispatchEvent: function(a) {
      if (void 0 !== this._listeners) {
        var b = this._listeners[a.type];
        if (void 0 !== b) {
          a.target = this;
          b = b.slice(0);
          for (var c = 0, d = b.length; c < d; c++) b[c].call(this, a)
        }
      }
    }
  });
  for (var xa = [], Ne = 0; 256 > Ne; Ne++) xa[Ne] = (16 > Ne ? "0" : "") + Ne.toString(16);
  var N = {
    DEG2RAD: Math.PI / 180,
    RAD2DEG: 180 / Math.PI,
    generateUUID: function() {
      var a = 4294967295 * Math.random() | 0,
        b = 4294967295 * Math.random() | 0,
        c = 4294967295 * Math.random() |
        0,
        d = 4294967295 * Math.random() | 0;
      return (xa[a & 255] + xa[a >> 8 & 255] + xa[a >> 16 & 255] + xa[a >> 24 & 255] + "-" + xa[b & 255] + xa[b >> 8 & 255] + "-" + xa[b >> 16 & 15 | 64] + xa[b >> 24 & 255] + "-" + xa[c & 63 | 128] + xa[c >> 8 & 255] + "-" + xa[c >> 16 & 255] + xa[c >> 24 & 255] + xa[d & 255] + xa[d >> 8 & 255] + xa[d >> 16 & 255] + xa[d >> 24 & 255]).toUpperCase()
    },
    clamp: function(a, b, c) {
      return Math.max(b, Math.min(c, a))
    },
    euclideanModulo: function(a, b) {
      return (a % b + b) % b
    },
    mapLinear: function(a, b, c, d, f) {
      return d + (a - b) * (f - d) / (c - b)
    },
    lerp: function(a, b, c) {
      return (1 - c) * a + c * b
    },
    smoothstep: function(a,
      b, c) {
      if (a <= b) return 0;
      if (a >= c) return 1;
      a = (a - b) / (c - b);
      return a * a * (3 - 2 * a)
    },
    smootherstep: function(a, b, c) {
      if (a <= b) return 0;
      if (a >= c) return 1;
      a = (a - b) / (c - b);
      return a * a * a * (a * (6 * a - 15) + 10)
    },
    randInt: function(a, b) {
      return a + Math.floor(Math.random() * (b - a + 1))
    },
    randFloat: function(a, b) {
      return a + Math.random() * (b - a)
    },
    randFloatSpread: function(a) {
      return a * (.5 - Math.random())
    },
    degToRad: function(a) {
      return a * N.DEG2RAD
    },
    radToDeg: function(a) {
      return a * N.RAD2DEG
    },
    isPowerOfTwo: function(a) {
      return 0 === (a & a - 1) && 0 !== a
    },
    ceilPowerOfTwo: function(a) {
      return Math.pow(2,
        Math.ceil(Math.log(a) / Math.LN2))
    },
    floorPowerOfTwo: function(a) {
      return Math.pow(2, Math.floor(Math.log(a) / Math.LN2))
    }
  };
  Object.defineProperties(z.prototype, {
    width: {
      get: function() {
        return this.x
      },
      set: function(a) {
        this.x = a
      }
    },
    height: {
      get: function() {
        return this.y
      },
      set: function(a) {
        this.y = a
      }
    }
  });
  Object.assign(z.prototype, {
    isVector2: !0,
    set: function(a, b) {
      this.x = a;
      this.y = b;
      return this
    },
    setScalar: function(a) {
      this.y = this.x = a;
      return this
    },
    setX: function(a) {
      this.x = a;
      return this
    },
    setY: function(a) {
      this.y = a;
      return this
    },
    setComponent: function(a, b) {
      switch (a) {
        case 0:
          this.x = b;
          break;
        case 1:
          this.y = b;
          break;
        default:
          throw Error("index is out of range: " + a);
      }
      return this
    },
    getComponent: function(a) {
      switch (a) {
        case 0:
          return this.x;
        case 1:
          return this.y;
        default:
          throw Error("index is out of range: " + a);
      }
    },
    clone: function() {
      return new this.constructor(this.x, this.y)
    },
    copy: function(a) {
      this.x = a.x;
      this.y = a.y;
      return this
    },
    add: function(a, b) {
      if (void 0 !== b) return console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),
        this.addVectors(a, b);
      this.x += a.x;
      this.y += a.y;
      return this
    },
    addScalar: function(a) {
      this.x += a;
      this.y += a;
      return this
    },
    addVectors: function(a, b) {
      this.x = a.x + b.x;
      this.y = a.y + b.y;
      return this
    },
    addScaledVector: function(a, b) {
      this.x += a.x * b;
      this.y += a.y * b;
      return this
    },
    sub: function(a, b) {
      if (void 0 !== b) return console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), this.subVectors(a, b);
      this.x -= a.x;
      this.y -= a.y;
      return this
    },
    subScalar: function(a) {
      this.x -= a;
      this.y -= a;
      return this
    },
    subVectors: function(a, b) {
      this.x = a.x - b.x;
      this.y = a.y - b.y;
      return this
    },
    multiply: function(a) {
      this.x *= a.x;
      this.y *= a.y;
      return this
    },
    multiplyScalar: function(a) {
      this.x *= a;
      this.y *= a;
      return this
    },
    divide: function(a) {
      this.x /= a.x;
      this.y /= a.y;
      return this
    },
    divideScalar: function(a) {
      return this.multiplyScalar(1 / a)
    },
    applyMatrix3: function(a) {
      var b = this.x,
        c = this.y;
      a = a.elements;
      this.x = a[0] * b + a[3] * c + a[6];
      this.y = a[1] * b + a[4] * c + a[7];
      return this
    },
    min: function(a) {
      this.x = Math.min(this.x, a.x);
      this.y = Math.min(this.y, a.y);
      return this
    },
    max: function(a) {
      this.x = Math.max(this.x, a.x);
      this.y = Math.max(this.y, a.y);
      return this
    },
    clamp: function(a, b) {
      this.x = Math.max(a.x, Math.min(b.x, this.x));
      this.y = Math.max(a.y, Math.min(b.y, this.y));
      return this
    },
    clampScalar: function(a, b) {
      this.x = Math.max(a, Math.min(b, this.x));
      this.y = Math.max(a, Math.min(b, this.y));
      return this
    },
    clampLength: function(a, b) {
      var c = this.length();
      return this.divideScalar(c || 1).multiplyScalar(Math.max(a, Math.min(b, c)))
    },
    floor: function() {
      this.x = Math.floor(this.x);
      this.y = Math.floor(this.y);
      return this
    },
    ceil: function() {
      this.x = Math.ceil(this.x);
      this.y = Math.ceil(this.y);
      return this
    },
    round: function() {
      this.x = Math.round(this.x);
      this.y = Math.round(this.y);
      return this
    },
    roundToZero: function() {
      this.x = 0 > this.x ? Math.ceil(this.x) : Math.floor(this.x);
      this.y = 0 > this.y ? Math.ceil(this.y) : Math.floor(this.y);
      return this
    },
    negate: function() {
      this.x = -this.x;
      this.y = -this.y;
      return this
    },
    dot: function(a) {
      return this.x * a.x + this.y * a.y
    },
    cross: function(a) {
      return this.x * a.y - this.y * a.x
    },
    lengthSq: function() {
      return this.x *
        this.x + this.y * this.y
    },
    length: function() {
      return Math.sqrt(this.x * this.x + this.y * this.y)
    },
    manhattanLength: function() {
      return Math.abs(this.x) + Math.abs(this.y)
    },
    normalize: function() {
      return this.divideScalar(this.length() || 1)
    },
    angle: function() {
      var a = Math.atan2(this.y, this.x);
      0 > a && (a += 2 * Math.PI);
      return a
    },
    distanceTo: function(a) {
      return Math.sqrt(this.distanceToSquared(a))
    },
    distanceToSquared: function(a) {
      var b = this.x - a.x;
      a = this.y - a.y;
      return b * b + a * a
    },
    manhattanDistanceTo: function(a) {
      return Math.abs(this.x - a.x) +
        Math.abs(this.y - a.y)
    },
    setLength: function(a) {
      return this.normalize().multiplyScalar(a)
    },
    lerp: function(a, b) {
      this.x += (a.x - this.x) * b;
      this.y += (a.y - this.y) * b;
      return this
    },
    lerpVectors: function(a, b, c) {
      return this.subVectors(b, a).multiplyScalar(c).add(a)
    },
    equals: function(a) {
      return a.x === this.x && a.y === this.y
    },
    fromArray: function(a, b) {
      void 0 === b && (b = 0);
      this.x = a[b];
      this.y = a[b + 1];
      return this
    },
    toArray: function(a, b) {
      void 0 === a && (a = []);
      void 0 === b && (b = 0);
      a[b] = this.x;
      a[b + 1] = this.y;
      return a
    },
    fromBufferAttribute: function(a,
      b, c) {
      void 0 !== c && console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute().");
      this.x = a.getX(b);
      this.y = a.getY(b);
      return this
    },
    rotateAround: function(a, b) {
      var c = Math.cos(b);
      b = Math.sin(b);
      var d = this.x - a.x,
        f = this.y - a.y;
      this.x = d * c - f * b + a.x;
      this.y = d * b + f * c + a.y;
      return this
    }
  });
  Object.assign(ya, {
    slerp: function(a, b, c, d) {
      return c.copy(a).slerp(b, d)
    },
    slerpFlat: function(a, b, c, d, f, g, k) {
      var m = c[d + 0],
        n = c[d + 1],
        p = c[d + 2];
      c = c[d + 3];
      d = f[g + 0];
      var l = f[g + 1],
        t = f[g + 2];
      f = f[g + 3];
      if (c !== f || m !== d || n !== l || p !==
        t) {
        g = 1 - k;
        var r = m * d + n * l + p * t + c * f,
          u = 0 <= r ? 1 : -1,
          q = 1 - r * r;
        q > Number.EPSILON && (q = Math.sqrt(q), r = Math.atan2(q, r * u), g = Math.sin(g * r) / q, k = Math.sin(k * r) / q);
        u *= k;
        m = m * g + d * u;
        n = n * g + l * u;
        p = p * g + t * u;
        c = c * g + f * u;
        g === 1 - k && (k = 1 / Math.sqrt(m * m + n * n + p * p + c * c), m *= k, n *= k, p *= k, c *= k)
      }
      a[b] = m;
      a[b + 1] = n;
      a[b + 2] = p;
      a[b + 3] = c
    }
  });
  Object.defineProperties(ya.prototype, {
    x: {
      get: function() {
        return this._x
      },
      set: function(a) {
        this._x = a;
        this._onChangeCallback()
      }
    },
    y: {
      get: function() {
        return this._y
      },
      set: function(a) {
        this._y = a;
        this._onChangeCallback()
      }
    },
    z: {
      get: function() {
        return this._z
      },
      set: function(a) {
        this._z = a;
        this._onChangeCallback()
      }
    },
    w: {
      get: function() {
        return this._w
      },
      set: function(a) {
        this._w = a;
        this._onChangeCallback()
      }
    }
  });
  Object.assign(ya.prototype, {
    isQuaternion: !0,
    set: function(a, b, c, d) {
      this._x = a;
      this._y = b;
      this._z = c;
      this._w = d;
      this._onChangeCallback();
      return this
    },
    clone: function() {
      return new this.constructor(this._x, this._y, this._z, this._w)
    },
    copy: function(a) {
      this._x = a.x;
      this._y = a.y;
      this._z = a.z;
      this._w = a.w;
      this._onChangeCallback();
      return this
    },
    setFromEuler: function(a, b) {
      if (!a ||
        !a.isEuler) throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");
      var c = a._x,
        d = a._y,
        f = a._z;
      a = a.order;
      var g = Math.cos,
        k = Math.sin,
        m = g(c / 2),
        n = g(d / 2);
      g = g(f / 2);
      c = k(c / 2);
      d = k(d / 2);
      f = k(f / 2);
      "XYZ" === a ? (this._x = c * n * g + m * d * f, this._y = m * d * g - c * n * f, this._z = m * n * f + c * d * g, this._w = m * n * g - c * d * f) : "YXZ" === a ? (this._x = c * n * g + m * d * f, this._y = m * d * g - c * n * f, this._z = m * n * f - c * d * g, this._w = m * n * g + c * d * f) : "ZXY" === a ? (this._x = c * n * g - m * d * f, this._y = m * d * g + c * n * f, this._z = m * n * f + c * d * g, this._w =
        m * n * g - c * d * f) : "ZYX" === a ? (this._x = c * n * g - m * d * f, this._y = m * d * g + c * n * f, this._z = m * n * f - c * d * g, this._w = m * n * g + c * d * f) : "YZX" === a ? (this._x = c * n * g + m * d * f, this._y = m * d * g + c * n * f, this._z = m * n * f - c * d * g, this._w = m * n * g - c * d * f) : "XZY" === a && (this._x = c * n * g - m * d * f, this._y = m * d * g - c * n * f, this._z = m * n * f + c * d * g, this._w = m * n * g + c * d * f);
      !1 !== b && this._onChangeCallback();
      return this
    },
    setFromAxisAngle: function(a, b) {
      b /= 2;
      var c = Math.sin(b);
      this._x = a.x * c;
      this._y = a.y * c;
      this._z = a.z * c;
      this._w = Math.cos(b);
      this._onChangeCallback();
      return this
    },
    setFromRotationMatrix: function(a) {
      var b =
        a.elements,
        c = b[0];
      a = b[4];
      var d = b[8],
        f = b[1],
        g = b[5],
        k = b[9],
        m = b[2],
        n = b[6];
      b = b[10];
      var p = c + g + b;
      0 < p ? (c = .5 / Math.sqrt(p + 1), this._w = .25 / c, this._x = (n - k) * c, this._y = (d - m) * c, this._z = (f - a) * c) : c > g && c > b ? (c = 2 * Math.sqrt(1 + c - g - b), this._w = (n - k) / c, this._x = .25 * c, this._y = (a + f) / c, this._z = (d + m) / c) : g > b ? (c = 2 * Math.sqrt(1 + g - c - b), this._w = (d - m) / c, this._x = (a + f) / c, this._y = .25 * c, this._z = (k + n) / c) : (c = 2 * Math.sqrt(1 + b - c - g), this._w = (f - a) / c, this._x = (d + m) / c, this._y = (k + n) / c, this._z = .25 * c);
      this._onChangeCallback();
      return this
    },
    setFromUnitVectors: function(a,
      b) {
      var c = a.dot(b) + 1;
      1E-6 > c ? (c = 0, Math.abs(a.x) > Math.abs(a.z) ? (this._x = -a.y, this._y = a.x, this._z = 0) : (this._x = 0, this._y = -a.z, this._z = a.y)) : (this._x = a.y * b.z - a.z * b.y, this._y = a.z * b.x - a.x * b.z, this._z = a.x * b.y - a.y * b.x);
      this._w = c;
      return this.normalize()
    },
    angleTo: function(a) {
      return 2 * Math.acos(Math.abs(N.clamp(this.dot(a), -1, 1)))
    },
    rotateTowards: function(a, b) {
      var c = this.angleTo(a);
      if (0 === c) return this;
      this.slerp(a, Math.min(1, b / c));
      return this
    },
    inverse: function() {
      return this.conjugate()
    },
    conjugate: function() {
      this._x *=
        -1;
      this._y *= -1;
      this._z *= -1;
      this._onChangeCallback();
      return this
    },
    dot: function(a) {
      return this._x * a._x + this._y * a._y + this._z * a._z + this._w * a._w
    },
    lengthSq: function() {
      return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w
    },
    length: function() {
      return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w)
    },
    normalize: function() {
      var a = this.length();
      0 === a ? (this._z = this._y = this._x = 0, this._w = 1) : (a = 1 / a, this._x *= a, this._y *= a, this._z *= a, this._w *= a);
      this._onChangeCallback();
      return this
    },
    multiply: function(a, b) {
      return void 0 !== b ? (console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."), this.multiplyQuaternions(a, b)) : this.multiplyQuaternions(this, a)
    },
    premultiply: function(a) {
      return this.multiplyQuaternions(a, this)
    },
    multiplyQuaternions: function(a, b) {
      var c = a._x,
        d = a._y,
        f = a._z;
      a = a._w;
      var g = b._x,
        k = b._y,
        m = b._z;
      b = b._w;
      this._x = c * b + a * g + d * m - f * k;
      this._y = d * b + a * k + f * g - c * m;
      this._z = f * b + a * m + c * k - d * g;
      this._w = a * b - c * g - d * k - f * m;
      this._onChangeCallback();
      return this
    },
    slerp: function(a, b) {
      if (0 === b) return this;
      if (1 === b) return this.copy(a);
      var c = this._x,
        d = this._y,
        f = this._z,
        g = this._w,
        k = g * a._w + c * a._x + d * a._y + f * a._z;
      0 > k ? (this._w = -a._w, this._x = -a._x, this._y = -a._y, this._z = -a._z, k = -k) : this.copy(a);
      if (1 <= k) return this._w = g, this._x = c, this._y = d, this._z = f, this;
      a = 1 - k * k;
      if (a <= Number.EPSILON) return k = 1 - b, this._w = k * g + b * this._w, this._x = k * c + b * this._x, this._y = k * d + b * this._y, this._z = k * f + b * this._z, this.normalize(), this._onChangeCallback(), this;
      a = Math.sqrt(a);
      var m = Math.atan2(a,
        k);
      k = Math.sin((1 - b) * m) / a;
      b = Math.sin(b * m) / a;
      this._w = g * k + this._w * b;
      this._x = c * k + this._x * b;
      this._y = d * k + this._y * b;
      this._z = f * k + this._z * b;
      this._onChangeCallback();
      return this
    },
    equals: function(a) {
      return a._x === this._x && a._y === this._y && a._z === this._z && a._w === this._w
    },
    fromArray: function(a, b) {
      void 0 === b && (b = 0);
      this._x = a[b];
      this._y = a[b + 1];
      this._z = a[b + 2];
      this._w = a[b + 3];
      this._onChangeCallback();
      return this
    },
    toArray: function(a, b) {
      void 0 === a && (a = []);
      void 0 === b && (b = 0);
      a[b] = this._x;
      a[b + 1] = this._y;
      a[b + 2] = this._z;
      a[b +
        3] = this._w;
      return a
    },
    _onChange: function(a) {
      this._onChangeCallback = a;
      return this
    },
    _onChangeCallback: function() {}
  });
  var rh = new q,
    gj = new ya;
  Object.assign(q.prototype, {
    isVector3: !0,
    set: function(a, b, c) {
      this.x = a;
      this.y = b;
      this.z = c;
      return this
    },
    setScalar: function(a) {
      this.z = this.y = this.x = a;
      return this
    },
    setX: function(a) {
      this.x = a;
      return this
    },
    setY: function(a) {
      this.y = a;
      return this
    },
    setZ: function(a) {
      this.z = a;
      return this
    },
    setComponent: function(a, b) {
      switch (a) {
        case 0:
          this.x = b;
          break;
        case 1:
          this.y = b;
          break;
        case 2:
          this.z =
            b;
          break;
        default:
          throw Error("index is out of range: " + a);
      }
      return this
    },
    getComponent: function(a) {
      switch (a) {
        case 0:
          return this.x;
        case 1:
          return this.y;
        case 2:
          return this.z;
        default:
          throw Error("index is out of range: " + a);
      }
    },
    clone: function() {
      return new this.constructor(this.x, this.y, this.z)
    },
    copy: function(a) {
      this.x = a.x;
      this.y = a.y;
      this.z = a.z;
      return this
    },
    add: function(a, b) {
      if (void 0 !== b) return console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."), this.addVectors(a,
        b);
      this.x += a.x;
      this.y += a.y;
      this.z += a.z;
      return this
    },
    addScalar: function(a) {
      this.x += a;
      this.y += a;
      this.z += a;
      return this
    },
    addVectors: function(a, b) {
      this.x = a.x + b.x;
      this.y = a.y + b.y;
      this.z = a.z + b.z;
      return this
    },
    addScaledVector: function(a, b) {
      this.x += a.x * b;
      this.y += a.y * b;
      this.z += a.z * b;
      return this
    },
    sub: function(a, b) {
      if (void 0 !== b) return console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), this.subVectors(a, b);
      this.x -= a.x;
      this.y -= a.y;
      this.z -= a.z;
      return this
    },
    subScalar: function(a) {
      this.x -=
        a;
      this.y -= a;
      this.z -= a;
      return this
    },
    subVectors: function(a, b) {
      this.x = a.x - b.x;
      this.y = a.y - b.y;
      this.z = a.z - b.z;
      return this
    },
    multiply: function(a, b) {
      if (void 0 !== b) return console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."), this.multiplyVectors(a, b);
      this.x *= a.x;
      this.y *= a.y;
      this.z *= a.z;
      return this
    },
    multiplyScalar: function(a) {
      this.x *= a;
      this.y *= a;
      this.z *= a;
      return this
    },
    multiplyVectors: function(a, b) {
      this.x = a.x * b.x;
      this.y = a.y * b.y;
      this.z = a.z * b.z;
      return this
    },
    applyEuler: function(a) {
      a && a.isEuler || console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.");
      return this.applyQuaternion(gj.setFromEuler(a))
    },
    applyAxisAngle: function(a, b) {
      return this.applyQuaternion(gj.setFromAxisAngle(a, b))
    },
    applyMatrix3: function(a) {
      var b = this.x,
        c = this.y,
        d = this.z;
      a = a.elements;
      this.x = a[0] * b + a[3] * c + a[6] * d;
      this.y = a[1] * b + a[4] * c + a[7] * d;
      this.z = a[2] * b + a[5] * c + a[8] * d;
      return this
    },
    applyMatrix4: function(a) {
      var b = this.x,
        c = this.y,
        d = this.z;
      a = a.elements;
      var f = 1 / (a[3] * b + a[7] * c + a[11] * d + a[15]);
      this.x = (a[0] * b + a[4] * c + a[8] * d + a[12]) * f;
      this.y = (a[1] * b + a[5] * c + a[9] * d + a[13]) * f;
      this.z = (a[2] * b + a[6] * c + a[10] * d + a[14]) * f;
      return this
    },
    applyQuaternion: function(a) {
      var b = this.x,
        c = this.y,
        d = this.z,
        f = a.x,
        g = a.y,
        k = a.z;
      a = a.w;
      var m = a * b + g * d - k * c,
        n = a * c + k * b - f * d,
        p = a * d + f * c - g * b;
      b = -f * b - g * c - k * d;
      this.x = m * a + b * -f + n * -k - p * -g;
      this.y = n * a + b * -g + p * -f - m * -k;
      this.z = p * a + b * -k + m * -g - n * -f;
      return this
    },
    project: function(a) {
      return this.applyMatrix4(a.matrixWorldInverse).applyMatrix4(a.projectionMatrix)
    },
    unproject: function(a) {
      return this.applyMatrix4(a.projectionMatrixInverse).applyMatrix4(a.matrixWorld)
    },
    transformDirection: function(a) {
      var b = this.x,
        c = this.y,
        d = this.z;
      a = a.elements;
      this.x = a[0] * b + a[4] * c + a[8] * d;
      this.y = a[1] * b + a[5] * c + a[9] * d;
      this.z = a[2] * b + a[6] * c + a[10] * d;
      return this.normalize()
    },
    divide: function(a) {
      this.x /= a.x;
      this.y /= a.y;
      this.z /= a.z;
      return this
    },
    divideScalar: function(a) {
      return this.multiplyScalar(1 / a)
    },
    min: function(a) {
      this.x = Math.min(this.x, a.x);
      this.y = Math.min(this.y, a.y);
      this.z = Math.min(this.z,
        a.z);
      return this
    },
    max: function(a) {
      this.x = Math.max(this.x, a.x);
      this.y = Math.max(this.y, a.y);
      this.z = Math.max(this.z, a.z);
      return this
    },
    clamp: function(a, b) {
      this.x = Math.max(a.x, Math.min(b.x, this.x));
      this.y = Math.max(a.y, Math.min(b.y, this.y));
      this.z = Math.max(a.z, Math.min(b.z, this.z));
      return this
    },
    clampScalar: function(a, b) {
      this.x = Math.max(a, Math.min(b, this.x));
      this.y = Math.max(a, Math.min(b, this.y));
      this.z = Math.max(a, Math.min(b, this.z));
      return this
    },
    clampLength: function(a, b) {
      var c = this.length();
      return this.divideScalar(c ||
        1).multiplyScalar(Math.max(a, Math.min(b, c)))
    },
    floor: function() {
      this.x = Math.floor(this.x);
      this.y = Math.floor(this.y);
      this.z = Math.floor(this.z);
      return this
    },
    ceil: function() {
      this.x = Math.ceil(this.x);
      this.y = Math.ceil(this.y);
      this.z = Math.ceil(this.z);
      return this
    },
    round: function() {
      this.x = Math.round(this.x);
      this.y = Math.round(this.y);
      this.z = Math.round(this.z);
      return this
    },
    roundToZero: function() {
      this.x = 0 > this.x ? Math.ceil(this.x) : Math.floor(this.x);
      this.y = 0 > this.y ? Math.ceil(this.y) : Math.floor(this.y);
      this.z =
        0 > this.z ? Math.ceil(this.z) : Math.floor(this.z);
      return this
    },
    negate: function() {
      this.x = -this.x;
      this.y = -this.y;
      this.z = -this.z;
      return this
    },
    dot: function(a) {
      return this.x * a.x + this.y * a.y + this.z * a.z
    },
    lengthSq: function() {
      return this.x * this.x + this.y * this.y + this.z * this.z
    },
    length: function() {
      return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z)
    },
    manhattanLength: function() {
      return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z)
    },
    normalize: function() {
      return this.divideScalar(this.length() || 1)
    },
    setLength: function(a) {
      return this.normalize().multiplyScalar(a)
    },
    lerp: function(a, b) {
      this.x += (a.x - this.x) * b;
      this.y += (a.y - this.y) * b;
      this.z += (a.z - this.z) * b;
      return this
    },
    lerpVectors: function(a, b, c) {
      return this.subVectors(b, a).multiplyScalar(c).add(a)
    },
    cross: function(a, b) {
      return void 0 !== b ? (console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."), this.crossVectors(a, b)) : this.crossVectors(this, a)
    },
    crossVectors: function(a, b) {
      var c = a.x,
        d = a.y;
      a = a.z;
      var f = b.x,
        g = b.y;
      b = b.z;
      this.x = d * b - a * g;
      this.y = a * f - c * b;
      this.z = c * g - d * f;
      return this
    },
    projectOnVector: function(a) {
      var b = a.dot(this) / a.lengthSq();
      return this.copy(a).multiplyScalar(b)
    },
    projectOnPlane: function(a) {
      rh.copy(this).projectOnVector(a);
      return this.sub(rh)
    },
    reflect: function(a) {
      return this.sub(rh.copy(a).multiplyScalar(2 * this.dot(a)))
    },
    angleTo: function(a) {
      var b = Math.sqrt(this.lengthSq() * a.lengthSq());
      0 === b && console.error("THREE.Vector3: angleTo() can't handle zero length vectors.");
      a = this.dot(a) / b;
      return Math.acos(N.clamp(a, -1, 1))
    },
    distanceTo: function(a) {
      return Math.sqrt(this.distanceToSquared(a))
    },
    distanceToSquared: function(a) {
      var b = this.x - a.x,
        c = this.y - a.y;
      a = this.z - a.z;
      return b * b + c * c + a * a
    },
    manhattanDistanceTo: function(a) {
      return Math.abs(this.x - a.x) + Math.abs(this.y - a.y) + Math.abs(this.z - a.z)
    },
    setFromSpherical: function(a) {
      return this.setFromSphericalCoords(a.radius, a.phi, a.theta)
    },
    setFromSphericalCoords: function(a, b, c) {
      var d = Math.sin(b) * a;
      this.x = d * Math.sin(c);
      this.y = Math.cos(b) * a;
      this.z = d * Math.cos(c);
      return this
    },
    setFromCylindrical: function(a) {
      return this.setFromCylindricalCoords(a.radius, a.theta,
        a.y)
    },
    setFromCylindricalCoords: function(a, b, c) {
      this.x = a * Math.sin(b);
      this.y = c;
      this.z = a * Math.cos(b);
      return this
    },
    setFromMatrixPosition: function(a) {
      a = a.elements;
      this.x = a[12];
      this.y = a[13];
      this.z = a[14];
      return this
    },
    setFromMatrixScale: function(a) {
      var b = this.setFromMatrixColumn(a, 0).length(),
        c = this.setFromMatrixColumn(a, 1).length();
      a = this.setFromMatrixColumn(a, 2).length();
      this.x = b;
      this.y = c;
      this.z = a;
      return this
    },
    setFromMatrixColumn: function(a, b) {
      return this.fromArray(a.elements, 4 * b)
    },
    equals: function(a) {
      return a.x ===
        this.x && a.y === this.y && a.z === this.z
    },
    fromArray: function(a, b) {
      void 0 === b && (b = 0);
      this.x = a[b];
      this.y = a[b + 1];
      this.z = a[b + 2];
      return this
    },
    toArray: function(a, b) {
      void 0 === a && (a = []);
      void 0 === b && (b = 0);
      a[b] = this.x;
      a[b + 1] = this.y;
      a[b + 2] = this.z;
      return a
    },
    fromBufferAttribute: function(a, b, c) {
      void 0 !== c && console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute().");
      this.x = a.getX(b);
      this.y = a.getY(b);
      this.z = a.getZ(b);
      return this
    }
  });
  var Bc = new q;
  Object.assign(ka.prototype, {
    isMatrix3: !0,
    set: function(a,
      b, c, d, f, g, k, m, n) {
      var p = this.elements;
      p[0] = a;
      p[1] = d;
      p[2] = k;
      p[3] = b;
      p[4] = f;
      p[5] = m;
      p[6] = c;
      p[7] = g;
      p[8] = n;
      return this
    },
    identity: function() {
      this.set(1, 0, 0, 0, 1, 0, 0, 0, 1);
      return this
    },
    clone: function() {
      return (new this.constructor).fromArray(this.elements)
    },
    copy: function(a) {
      var b = this.elements;
      a = a.elements;
      b[0] = a[0];
      b[1] = a[1];
      b[2] = a[2];
      b[3] = a[3];
      b[4] = a[4];
      b[5] = a[5];
      b[6] = a[6];
      b[7] = a[7];
      b[8] = a[8];
      return this
    },
    setFromMatrix4: function(a) {
      a = a.elements;
      this.set(a[0], a[4], a[8], a[1], a[5], a[9], a[2], a[6], a[10]);
      return this
    },
    applyToBufferAttribute: function(a) {
      for (var b = 0, c = a.count; b < c; b++) Bc.x = a.getX(b), Bc.y = a.getY(b), Bc.z = a.getZ(b), Bc.applyMatrix3(this), a.setXYZ(b, Bc.x, Bc.y, Bc.z);
      return a
    },
    multiply: function(a) {
      return this.multiplyMatrices(this, a)
    },
    premultiply: function(a) {
      return this.multiplyMatrices(a, this)
    },
    multiplyMatrices: function(a, b) {
      var c = a.elements,
        d = b.elements;
      b = this.elements;
      a = c[0];
      var f = c[3],
        g = c[6],
        k = c[1],
        m = c[4],
        n = c[7],
        p = c[2],
        l = c[5];
      c = c[8];
      var t = d[0],
        r = d[3],
        u = d[6],
        q = d[1],
        w = d[4],
        x = d[7],
        B = d[2],
        C = d[5];
      d = d[8];
      b[0] = a * t + f * q + g * B;
      b[3] = a * r + f * w + g * C;
      b[6] = a * u + f * x + g * d;
      b[1] = k * t + m * q + n * B;
      b[4] = k * r + m * w + n * C;
      b[7] = k * u + m * x + n * d;
      b[2] = p * t + l * q + c * B;
      b[5] = p * r + l * w + c * C;
      b[8] = p * u + l * x + c * d;
      return this
    },
    multiplyScalar: function(a) {
      var b = this.elements;
      b[0] *= a;
      b[3] *= a;
      b[6] *= a;
      b[1] *= a;
      b[4] *= a;
      b[7] *= a;
      b[2] *= a;
      b[5] *= a;
      b[8] *= a;
      return this
    },
    determinant: function() {
      var a = this.elements,
        b = a[0],
        c = a[1],
        d = a[2],
        f = a[3],
        g = a[4],
        k = a[5],
        m = a[6],
        n = a[7];
      a = a[8];
      return b * g * a - b * k * n - c * f * a + c * k * m + d * f * n - d * g * m
    },
    getInverse: function(a, b) {
      a && a.isMatrix4 && console.error("THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument.");
      var c = a.elements;
      a = this.elements;
      var d = c[0],
        f = c[1],
        g = c[2],
        k = c[3],
        m = c[4],
        n = c[5],
        p = c[6],
        l = c[7];
      c = c[8];
      var t = c * m - n * l,
        r = n * p - c * k,
        u = l * k - m * p,
        q = d * t + f * r + g * u;
      if (0 === q) {
        if (!0 === b) throw Error("THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0");
        console.warn("THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0");
        return this.identity()
      }
      b = 1 / q;
      a[0] = t * b;
      a[1] = (g * l - c * f) * b;
      a[2] = (n * f - g * m) * b;
      a[3] = r * b;
      a[4] = (c * d - g * p) * b;
      a[5] = (g * k - n * d) * b;
      a[6] = u * b;
      a[7] = (f * p - l * d) * b;
      a[8] = (m * d - f * k) * b;
      return this
    },
    transpose: function() {
      var a = this.elements;
      var b = a[1];
      a[1] = a[3];
      a[3] = b;
      b = a[2];
      a[2] = a[6];
      a[6] = b;
      b = a[5];
      a[5] = a[7];
      a[7] = b;
      return this
    },
    getNormalMatrix: function(a) {
      return this.setFromMatrix4(a).getInverse(this).transpose()
    },
    transposeIntoArray: function(a) {
      var b = this.elements;
      a[0] = b[0];
      a[1] = b[3];
      a[2] = b[6];
      a[3] = b[1];
      a[4] = b[4];
      a[5] = b[7];
      a[6] = b[2];
      a[7] = b[5];
      a[8] = b[8];
      return this
    },
    setUvTransform: function(a, b, c, d, f, g, k) {
      var m = Math.cos(f);
      f = Math.sin(f);
      this.set(c * m, c * f, -c * (m * g + f * k) + g + a, -d * f, d * m, -d * (-f * g + m * k) + k +
        b, 0, 0, 1)
    },
    scale: function(a, b) {
      var c = this.elements;
      c[0] *= a;
      c[3] *= a;
      c[6] *= a;
      c[1] *= b;
      c[4] *= b;
      c[7] *= b;
      return this
    },
    rotate: function(a) {
      var b = Math.cos(a);
      a = Math.sin(a);
      var c = this.elements,
        d = c[0],
        f = c[3],
        g = c[6],
        k = c[1],
        m = c[4],
        n = c[7];
      c[0] = b * d + a * k;
      c[3] = b * f + a * m;
      c[6] = b * g + a * n;
      c[1] = -a * d + b * k;
      c[4] = -a * f + b * m;
      c[7] = -a * g + b * n;
      return this
    },
    translate: function(a, b) {
      var c = this.elements;
      c[0] += a * c[2];
      c[3] += a * c[5];
      c[6] += a * c[8];
      c[1] += b * c[2];
      c[4] += b * c[5];
      c[7] += b * c[8];
      return this
    },
    equals: function(a) {
      var b = this.elements;
      a = a.elements;
      for (var c = 0; 9 > c; c++)
        if (b[c] !== a[c]) return !1;
      return !0
    },
    fromArray: function(a, b) {
      void 0 === b && (b = 0);
      for (var c = 0; 9 > c; c++) this.elements[c] = a[c + b];
      return this
    },
    toArray: function(a, b) {
      void 0 === a && (a = []);
      void 0 === b && (b = 0);
      var c = this.elements;
      a[b] = c[0];
      a[b + 1] = c[1];
      a[b + 2] = c[2];
      a[b + 3] = c[3];
      a[b + 4] = c[4];
      a[b + 5] = c[5];
      a[b + 6] = c[6];
      a[b + 7] = c[7];
      a[b + 8] = c[8];
      return a
    }
  });
  var Ad, Qb = {
      getDataURL: function(a) {
        if ("undefined" == typeof HTMLCanvasElement) return a.src;
        if (!(a instanceof HTMLCanvasElement)) {
          void 0 === Ad && (Ad = V.createElementNS("1999xhtml",
            "canvas"));
          Ad.width = a.width;
          Ad.height = a.height;
          var b = Ad.getContext("2d");
          a instanceof ImageData ? b.putImageData(a, 0, 0) : b.drawImage(a, 0, 0, a.width, a.height);
          a = Ad
        }
        return 2048 < a.width || 2048 < a.height ? a.toDataURL("image/jpeg", .6) : a.toDataURL("image/png")
      }
    },
    Oj = 0;
  S.DEFAULT_IMAGE = void 0;
  S.DEFAULT_MAPPING = 300;
  S.prototype = Object.assign(Object.create(Ra.prototype), {
    constructor: S,
    isTexture: !0,
    updateMatrix: function() {
      this.matrix.setUvTransform(this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation,
        this.center.x, this.center.y)
    },
    clone: function() {
      return (new this.constructor).copy(this)
    },
    copy: function(a) {
      this.name = a.name;
      this.image = a.image;
      this.mipmaps = a.mipmaps.slice(0);
      this.mapping = a.mapping;
      this.wrapS = a.wrapS;
      this.wrapT = a.wrapT;
      this.magFilter = a.magFilter;
      this.minFilter = a.minFilter;
      this.anisotropy = a.anisotropy;
      this.format = a.format;
      this.type = a.type;
      this.offset.copy(a.offset);
      this.repeat.copy(a.repeat);
      this.center.copy(a.center);
      this.rotation = a.rotation;
      this.matrixAutoUpdate = a.matrixAutoUpdate;
      this.matrix.copy(a.matrix);
      this.generateMipmaps = a.generateMipmaps;
      this.premultiplyAlpha = a.premultiplyAlpha;
      this.flipY = a.flipY;
      this.unpackAlignment = a.unpackAlignment;
      this.encoding = a.encoding;
      return this
    },
    toJSON: function(a) {
      var b = void 0 === a || "string" === typeof a;
      if (!b && void 0 !== a.textures[this.uuid]) return a.textures[this.uuid];
      var c = {
        metadata: {
          version: 4.5,
          type: "Texture",
          generator: "Texture.toJSON"
        },
        uuid: this.uuid,
        name: this.name,
        mapping: this.mapping,
        repeat: [this.repeat.x, this.repeat.y],
        offset: [this.offset.x,
          this.offset.y
        ],
        center: [this.center.x, this.center.y],
        rotation: this.rotation,
        wrap: [this.wrapS, this.wrapT],
        format: this.format,
        type: this.type,
        encoding: this.encoding,
        minFilter: this.minFilter,
        magFilter: this.magFilter,
        anisotropy: this.anisotropy,
        flipY: this.flipY,
        premultiplyAlpha: this.premultiplyAlpha,
        unpackAlignment: this.unpackAlignment
      };
      if (void 0 !== this.image) {
        var d = this.image;
        void 0 === d.uuid && (d.uuid = N.generateUUID());
        if (!b && void 0 === a.images[d.uuid]) {
          if (Array.isArray(d)) {
            var f = [];
            for (var g = 0, k = d.length; g <
              k; g++) f.push(Qb.getDataURL(d[g]))
          } else f = Qb.getDataURL(d);
          a.images[d.uuid] = {
            uuid: d.uuid,
            url: f
          }
        }
        c.image = d.uuid
      }
      b || (a.textures[this.uuid] = c);
      return c
    },
    dispose: function() {
      this.dispatchEvent({
        type: "dispose"
      })
    },
    transformUv: function(a) {
      if (300 !== this.mapping) return a;
      a.applyMatrix3(this.matrix);
      if (0 > a.x || 1 < a.x) switch (this.wrapS) {
        case 1E3:
          a.x -= Math.floor(a.x);
          break;
        case 1001:
          a.x = 0 > a.x ? 0 : 1;
          break;
        case 1002:
          a.x = 1 === Math.abs(Math.floor(a.x) % 2) ? Math.ceil(a.x) - a.x : a.x - Math.floor(a.x)
      }
      if (0 > a.y || 1 < a.y) switch (this.wrapT) {
        case 1E3:
          a.y -=
            Math.floor(a.y);
          break;
        case 1001:
          a.y = 0 > a.y ? 0 : 1;
          break;
        case 1002:
          a.y = 1 === Math.abs(Math.floor(a.y) % 2) ? Math.ceil(a.y) - a.y : a.y - Math.floor(a.y)
      }
      this.flipY && (a.y = 1 - a.y);
      return a
    }
  });
  Object.defineProperty(S.prototype, "needsUpdate", {
    set: function(a) {
      !0 === a && this.version++
    }
  });
  Object.defineProperties(ca.prototype, {
    width: {
      get: function() {
        return this.z
      },
      set: function(a) {
        this.z = a
      }
    },
    height: {
      get: function() {
        return this.w
      },
      set: function(a) {
        this.w = a
      }
    }
  });
  Object.assign(ca.prototype, {
    isVector4: !0,
    set: function(a, b, c, d) {
      this.x =
        a;
      this.y = b;
      this.z = c;
      this.w = d;
      return this
    },
    setScalar: function(a) {
      this.w = this.z = this.y = this.x = a;
      return this
    },
    setX: function(a) {
      this.x = a;
      return this
    },
    setY: function(a) {
      this.y = a;
      return this
    },
    setZ: function(a) {
      this.z = a;
      return this
    },
    setW: function(a) {
      this.w = a;
      return this
    },
    setComponent: function(a, b) {
      switch (a) {
        case 0:
          this.x = b;
          break;
        case 1:
          this.y = b;
          break;
        case 2:
          this.z = b;
          break;
        case 3:
          this.w = b;
          break;
        default:
          throw Error("index is out of range: " + a);
      }
      return this
    },
    getComponent: function(a) {
      switch (a) {
        case 0:
          return this.x;
        case 1:
          return this.y;
        case 2:
          return this.z;
        case 3:
          return this.w;
        default:
          throw Error("index is out of range: " + a);
      }
    },
    clone: function() {
      return new this.constructor(this.x, this.y, this.z, this.w)
    },
    copy: function(a) {
      this.x = a.x;
      this.y = a.y;
      this.z = a.z;
      this.w = void 0 !== a.w ? a.w : 1;
      return this
    },
    add: function(a, b) {
      if (void 0 !== b) return console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."), this.addVectors(a, b);
      this.x += a.x;
      this.y += a.y;
      this.z += a.z;
      this.w += a.w;
      return this
    },
    addScalar: function(a) {
      this.x += a;
      this.y += a;
      this.z += a;
      this.w += a;
      return this
    },
    addVectors: function(a, b) {
      this.x = a.x + b.x;
      this.y = a.y + b.y;
      this.z = a.z + b.z;
      this.w = a.w + b.w;
      return this
    },
    addScaledVector: function(a, b) {
      this.x += a.x * b;
      this.y += a.y * b;
      this.z += a.z * b;
      this.w += a.w * b;
      return this
    },
    sub: function(a, b) {
      if (void 0 !== b) return console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), this.subVectors(a, b);
      this.x -= a.x;
      this.y -= a.y;
      this.z -= a.z;
      this.w -= a.w;
      return this
    },
    subScalar: function(a) {
      this.x -=
        a;
      this.y -= a;
      this.z -= a;
      this.w -= a;
      return this
    },
    subVectors: function(a, b) {
      this.x = a.x - b.x;
      this.y = a.y - b.y;
      this.z = a.z - b.z;
      this.w = a.w - b.w;
      return this
    },
    multiplyScalar: function(a) {
      this.x *= a;
      this.y *= a;
      this.z *= a;
      this.w *= a;
      return this
    },
    applyMatrix4: function(a) {
      var b = this.x,
        c = this.y,
        d = this.z,
        f = this.w;
      a = a.elements;
      this.x = a[0] * b + a[4] * c + a[8] * d + a[12] * f;
      this.y = a[1] * b + a[5] * c + a[9] * d + a[13] * f;
      this.z = a[2] * b + a[6] * c + a[10] * d + a[14] * f;
      this.w = a[3] * b + a[7] * c + a[11] * d + a[15] * f;
      return this
    },
    divideScalar: function(a) {
      return this.multiplyScalar(1 /
        a)
    },
    setAxisAngleFromQuaternion: function(a) {
      this.w = 2 * Math.acos(a.w);
      var b = Math.sqrt(1 - a.w * a.w);
      1E-4 > b ? (this.x = 1, this.z = this.y = 0) : (this.x = a.x / b, this.y = a.y / b, this.z = a.z / b);
      return this
    },
    setAxisAngleFromRotationMatrix: function(a) {
      a = a.elements;
      var b = a[0];
      var c = a[4];
      var d = a[8],
        f = a[1],
        g = a[5],
        k = a[9];
      var m = a[2];
      var n = a[6];
      var p = a[10];
      if (.01 > Math.abs(c - f) && .01 > Math.abs(d - m) && .01 > Math.abs(k - n)) {
        if (.1 > Math.abs(c + f) && .1 > Math.abs(d + m) && .1 > Math.abs(k + n) && .1 > Math.abs(b + g + p - 3)) return this.set(1, 0, 0, 0), this;
        a = Math.PI;
        b = (b + 1) / 2;
        g = (g + 1) / 2;
        p = (p + 1) / 2;
        c = (c + f) / 4;
        d = (d + m) / 4;
        k = (k + n) / 4;
        b > g && b > p ? .01 > b ? (n = 0, c = m = .707106781) : (n = Math.sqrt(b), m = c / n, c = d / n) : g > p ? .01 > g ? (n = .707106781, m = 0, c = .707106781) : (m = Math.sqrt(g), n = c / m, c = k / m) : .01 > p ? (m = n = .707106781, c = 0) : (c = Math.sqrt(p), n = d / c, m = k / c);
        this.set(n, m, c, a);
        return this
      }
      a = Math.sqrt((n - k) * (n - k) + (d - m) * (d - m) + (f - c) * (f - c));
      .001 > Math.abs(a) && (a = 1);
      this.x = (n - k) / a;
      this.y = (d - m) / a;
      this.z = (f - c) / a;
      this.w = Math.acos((b + g + p - 1) / 2);
      return this
    },
    min: function(a) {
      this.x = Math.min(this.x, a.x);
      this.y = Math.min(this.y,
        a.y);
      this.z = Math.min(this.z, a.z);
      this.w = Math.min(this.w, a.w);
      return this
    },
    max: function(a) {
      this.x = Math.max(this.x, a.x);
      this.y = Math.max(this.y, a.y);
      this.z = Math.max(this.z, a.z);
      this.w = Math.max(this.w, a.w);
      return this
    },
    clamp: function(a, b) {
      this.x = Math.max(a.x, Math.min(b.x, this.x));
      this.y = Math.max(a.y, Math.min(b.y, this.y));
      this.z = Math.max(a.z, Math.min(b.z, this.z));
      this.w = Math.max(a.w, Math.min(b.w, this.w));
      return this
    },
    clampScalar: function(a, b) {
      this.x = Math.max(a, Math.min(b, this.x));
      this.y = Math.max(a, Math.min(b,
        this.y));
      this.z = Math.max(a, Math.min(b, this.z));
      this.w = Math.max(a, Math.min(b, this.w));
      return this
    },
    clampLength: function(a, b) {
      var c = this.length();
      return this.divideScalar(c || 1).multiplyScalar(Math.max(a, Math.min(b, c)))
    },
    floor: function() {
      this.x = Math.floor(this.x);
      this.y = Math.floor(this.y);
      this.z = Math.floor(this.z);
      this.w = Math.floor(this.w);
      return this
    },
    ceil: function() {
      this.x = Math.ceil(this.x);
      this.y = Math.ceil(this.y);
      this.z = Math.ceil(this.z);
      this.w = Math.ceil(this.w);
      return this
    },
    round: function() {
      this.x =
        Math.round(this.x);
      this.y = Math.round(this.y);
      this.z = Math.round(this.z);
      this.w = Math.round(this.w);
      return this
    },
    roundToZero: function() {
      this.x = 0 > this.x ? Math.ceil(this.x) : Math.floor(this.x);
      this.y = 0 > this.y ? Math.ceil(this.y) : Math.floor(this.y);
      this.z = 0 > this.z ? Math.ceil(this.z) : Math.floor(this.z);
      this.w = 0 > this.w ? Math.ceil(this.w) : Math.floor(this.w);
      return this
    },
    negate: function() {
      this.x = -this.x;
      this.y = -this.y;
      this.z = -this.z;
      this.w = -this.w;
      return this
    },
    dot: function(a) {
      return this.x * a.x + this.y * a.y + this.z *
        a.z + this.w * a.w
    },
    lengthSq: function() {
      return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w
    },
    length: function() {
      return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w)
    },
    manhattanLength: function() {
      return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w)
    },
    normalize: function() {
      return this.divideScalar(this.length() || 1)
    },
    setLength: function(a) {
      return this.normalize().multiplyScalar(a)
    },
    lerp: function(a, b) {
      this.x += (a.x - this.x) * b;
      this.y += (a.y - this.y) * b;
      this.z += (a.z -
        this.z) * b;
      this.w += (a.w - this.w) * b;
      return this
    },
    lerpVectors: function(a, b, c) {
      return this.subVectors(b, a).multiplyScalar(c).add(a)
    },
    equals: function(a) {
      return a.x === this.x && a.y === this.y && a.z === this.z && a.w === this.w
    },
    fromArray: function(a, b) {
      void 0 === b && (b = 0);
      this.x = a[b];
      this.y = a[b + 1];
      this.z = a[b + 2];
      this.w = a[b + 3];
      return this
    },
    toArray: function(a, b) {
      void 0 === a && (a = []);
      void 0 === b && (b = 0);
      a[b] = this.x;
      a[b + 1] = this.y;
      a[b + 2] = this.z;
      a[b + 3] = this.w;
      return a
    },
    fromBufferAttribute: function(a, b, c) {
      void 0 !== c && console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute().");
      this.x = a.getX(b);
      this.y = a.getY(b);
      this.z = a.getZ(b);
      this.w = a.getW(b);
      return this
    }
  });
  sa.prototype = Object.assign(Object.create(Ra.prototype), {
    constructor: sa,
    isWebGLRenderTarget: !0,
    setSize: function(a, b) {
      if (this.width !== a || this.height !== b) this.width = a, this.height = b, this.texture.image.width = a, this.texture.image.height = b, this.dispose();
      this.viewport.set(0, 0, a, b);
      this.scissor.set(0, 0, a, b)
    },
    clone: function() {
      return (new this.constructor).copy(this)
    },
    copy: function(a) {
      this.width = a.width;
      this.height = a.height;
      this.viewport.copy(a.viewport);
      this.texture = a.texture.clone();
      this.depthBuffer = a.depthBuffer;
      this.stencilBuffer = a.stencilBuffer;
      this.depthTexture = a.depthTexture;
      return this
    },
    dispose: function() {
      this.dispatchEvent({
        type: "dispose"
      })
    }
  });
  qg.prototype = Object.assign(Object.create(sa.prototype), {
    constructor: qg,
    isWebGLMultisampleRenderTarget: !0,
    copy: function(a) {
      sa.prototype.copy.call(this, a);
      this.samples = a.samples;
      return this
    }
  });
  var Na = new q,
    ea = new I,
    Bl = new q(0, 0, 0),
    Cl = new q(1, 1, 1),
    Rb = new q,
    Pf = new q,
    Da = new q;
  Object.assign(I.prototype, {
    isMatrix4: !0,
    set: function(a, b, c, d, f, g, k, m, n, p, l, t, r, u, q, w) {
      var y = this.elements;
      y[0] = a;
      y[4] = b;
      y[8] = c;
      y[12] = d;
      y[1] = f;
      y[5] = g;
      y[9] = k;
      y[13] = m;
      y[2] = n;
      y[6] = p;
      y[10] = l;
      y[14] = t;
      y[3] = r;
      y[7] = u;
      y[11] = q;
      y[15] = w;
      return this
    },
    identity: function() {
      this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
      return this
    },
    clone: function() {
      return (new I).fromArray(this.elements)
    },
    copy: function(a) {
      var b = this.elements;
      a = a.elements;
      b[0] = a[0];
      b[1] = a[1];
      b[2] = a[2];
      b[3] = a[3];
      b[4] = a[4];
      b[5] = a[5];
      b[6] = a[6];
      b[7] = a[7];
      b[8] = a[8];
      b[9] = a[9];
      b[10] = a[10];
      b[11] = a[11];
      b[12] = a[12];
      b[13] = a[13];
      b[14] = a[14];
      b[15] = a[15];
      return this
    },
    copyPosition: function(a) {
      var b = this.elements;
      a = a.elements;
      b[12] = a[12];
      b[13] = a[13];
      b[14] = a[14];
      return this
    },
    extractBasis: function(a, b, c) {
      a.setFromMatrixColumn(this, 0);
      b.setFromMatrixColumn(this, 1);
      c.setFromMatrixColumn(this, 2);
      return this
    },
    makeBasis: function(a, b, c) {
      this.set(a.x, b.x, c.x, 0, a.y, b.y, c.y, 0, a.z, b.z, c.z, 0, 0, 0, 0, 1);
      return this
    },
    extractRotation: function(a) {
      var b = this.elements,
        c = a.elements,
        d = 1 / Na.setFromMatrixColumn(a, 0).length(),
        f = 1 / Na.setFromMatrixColumn(a, 1).length();
      a = 1 / Na.setFromMatrixColumn(a, 2).length();
      b[0] = c[0] * d;
      b[1] = c[1] * d;
      b[2] = c[2] * d;
      b[3] = 0;
      b[4] = c[4] * f;
      b[5] = c[5] * f;
      b[6] = c[6] * f;
      b[7] = 0;
      b[8] = c[8] * a;
      b[9] = c[9] * a;
      b[10] = c[10] * a;
      b[11] = 0;
      b[12] = 0;
      b[13] = 0;
      b[14] = 0;
      b[15] = 1;
      return this
    },
    makeRotationFromEuler: function(a) {
      a && a.isEuler || console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");
      var b = this.elements,
        c = a.x,
        d = a.y,
        f = a.z,
        g = Math.cos(c);
      c = Math.sin(c);
      var k = Math.cos(d);
      d = Math.sin(d);
      var m = Math.cos(f);
      f = Math.sin(f);
      if ("XYZ" === a.order) {
        a = g * m;
        var n = g * f,
          p = c * m,
          l = c * f;
        b[0] = k * m;
        b[4] = -k * f;
        b[8] = d;
        b[1] = n + p * d;
        b[5] = a - l * d;
        b[9] = -c * k;
        b[2] = l - a * d;
        b[6] = p + n * d;
        b[10] = g * k
      } else "YXZ" === a.order ? (a = k * m, n = k * f, p = d * m, l = d * f, b[0] = a + l * c, b[4] = p * c - n, b[8] = g * d, b[1] = g * f, b[5] = g * m, b[9] = -c, b[2] = n * c - p, b[6] = l + a * c, b[10] = g * k) : "ZXY" === a.order ? (a = k * m, n = k * f, p = d * m, l = d * f, b[0] = a - l * c, b[4] = -g * f, b[8] = p + n * c, b[1] = n + p * c, b[5] = g * m, b[9] = l - a * c, b[2] = -g * d, b[6] = c, b[10] = g * k) : "ZYX" === a.order ? (a = g * m, n = g * f, p = c * m, l = c * f, b[0] = k * m,
        b[4] = p * d - n, b[8] = a * d + l, b[1] = k * f, b[5] = l * d + a, b[9] = n * d - p, b[2] = -d, b[6] = c * k, b[10] = g * k) : "YZX" === a.order ? (a = g * k, n = g * d, p = c * k, l = c * d, b[0] = k * m, b[4] = l - a * f, b[8] = p * f + n, b[1] = f, b[5] = g * m, b[9] = -c * m, b[2] = -d * m, b[6] = n * f + p, b[10] = a - l * f) : "XZY" === a.order && (a = g * k, n = g * d, p = c * k, l = c * d, b[0] = k * m, b[4] = -f, b[8] = d * m, b[1] = a * f + l, b[5] = g * m, b[9] = n * f - p, b[2] = p * f - n, b[6] = c * m, b[10] = l * f + a);
      b[3] = 0;
      b[7] = 0;
      b[11] = 0;
      b[12] = 0;
      b[13] = 0;
      b[14] = 0;
      b[15] = 1;
      return this
    },
    makeRotationFromQuaternion: function(a) {
      return this.compose(Bl, a, Cl)
    },
    lookAt: function(a, b,
      c) {
      var d = this.elements;
      Da.subVectors(a, b);
      0 === Da.lengthSq() && (Da.z = 1);
      Da.normalize();
      Rb.crossVectors(c, Da);
      0 === Rb.lengthSq() && (1 === Math.abs(c.z) ? Da.x += 1E-4 : Da.z += 1E-4, Da.normalize(), Rb.crossVectors(c, Da));
      Rb.normalize();
      Pf.crossVectors(Da, Rb);
      d[0] = Rb.x;
      d[4] = Pf.x;
      d[8] = Da.x;
      d[1] = Rb.y;
      d[5] = Pf.y;
      d[9] = Da.y;
      d[2] = Rb.z;
      d[6] = Pf.z;
      d[10] = Da.z;
      return this
    },
    multiply: function(a, b) {
      return void 0 !== b ? (console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),
        this.multiplyMatrices(a, b)) : this.multiplyMatrices(this, a)
    },
    premultiply: function(a) {
      return this.multiplyMatrices(a, this)
    },
    multiplyMatrices: function(a, b) {
      var c = a.elements,
        d = b.elements;
      b = this.elements;
      a = c[0];
      var f = c[4],
        g = c[8],
        k = c[12],
        m = c[1],
        n = c[5],
        p = c[9],
        l = c[13],
        t = c[2],
        r = c[6],
        q = c[10],
        v = c[14],
        w = c[3],
        x = c[7],
        B = c[11];
      c = c[15];
      var C = d[0],
        A = d[4],
        z = d[8],
        D = d[12],
        E = d[1],
        F = d[5],
        H = d[9],
        G = d[13],
        I = d[2],
        K = d[6],
        M = d[10],
        N = d[14],
        O = d[3],
        P = d[7],
        Q = d[11];
      d = d[15];
      b[0] = a * C + f * E + g * I + k * O;
      b[4] = a * A + f * F + g * K + k * P;
      b[8] = a * z + f * H + g * M +
        k * Q;
      b[12] = a * D + f * G + g * N + k * d;
      b[1] = m * C + n * E + p * I + l * O;
      b[5] = m * A + n * F + p * K + l * P;
      b[9] = m * z + n * H + p * M + l * Q;
      b[13] = m * D + n * G + p * N + l * d;
      b[2] = t * C + r * E + q * I + v * O;
      b[6] = t * A + r * F + q * K + v * P;
      b[10] = t * z + r * H + q * M + v * Q;
      b[14] = t * D + r * G + q * N + v * d;
      b[3] = w * C + x * E + B * I + c * O;
      b[7] = w * A + x * F + B * K + c * P;
      b[11] = w * z + x * H + B * M + c * Q;
      b[15] = w * D + x * G + B * N + c * d;
      return this
    },
    multiplyScalar: function(a) {
      var b = this.elements;
      b[0] *= a;
      b[4] *= a;
      b[8] *= a;
      b[12] *= a;
      b[1] *= a;
      b[5] *= a;
      b[9] *= a;
      b[13] *= a;
      b[2] *= a;
      b[6] *= a;
      b[10] *= a;
      b[14] *= a;
      b[3] *= a;
      b[7] *= a;
      b[11] *= a;
      b[15] *= a;
      return this
    },
    applyToBufferAttribute: function(a) {
      for (var b =
          0, c = a.count; b < c; b++) Na.x = a.getX(b), Na.y = a.getY(b), Na.z = a.getZ(b), Na.applyMatrix4(this), a.setXYZ(b, Na.x, Na.y, Na.z);
      return a
    },
    determinant: function() {
      var a = this.elements,
        b = a[0],
        c = a[4],
        d = a[8],
        f = a[12],
        g = a[1],
        k = a[5],
        m = a[9],
        n = a[13],
        p = a[2],
        l = a[6],
        t = a[10],
        r = a[14];
      return a[3] * (+f * m * l - d * n * l - f * k * t + c * n * t + d * k * r - c * m * r) + a[7] * (+b * m * r - b * n * t + f * g * t - d * g * r + d * n * p - f * m * p) + a[11] * (+b * n * l - b * k * r - f * g * l + c * g * r + f * k * p - c * n * p) + a[15] * (-d * k * p - b * m * l + b * k * t + d * g * l - c * g * t + c * m * p)
    },
    transpose: function() {
      var a = this.elements;
      var b = a[1];
      a[1] = a[4];
      a[4] = b;
      b = a[2];
      a[2] = a[8];
      a[8] = b;
      b = a[6];
      a[6] = a[9];
      a[9] = b;
      b = a[3];
      a[3] = a[12];
      a[12] = b;
      b = a[7];
      a[7] = a[13];
      a[13] = b;
      b = a[11];
      a[11] = a[14];
      a[14] = b;
      return this
    },
    setPosition: function(a, b, c) {
      var d = this.elements;
      a.isVector3 ? (d[12] = a.x, d[13] = a.y, d[14] = a.z) : (d[12] = a, d[13] = b, d[14] = c);
      return this
    },
    getInverse: function(a, b) {
      var c = this.elements,
        d = a.elements;
      a = d[0];
      var f = d[1],
        g = d[2],
        k = d[3],
        m = d[4],
        n = d[5],
        p = d[6],
        l = d[7],
        t = d[8],
        r = d[9],
        q = d[10],
        v = d[11],
        w = d[12],
        x = d[13],
        B = d[14];
      d = d[15];
      var C = r * B * l - x * q * l + x * p * v - n * B * v - r * p * d + n * q * d,
        A = w * q * l - t * B * l - w * p * v + m * B * v + t * p * d - m * q * d,
        z = t * x * l - w * r * l + w * n * v - m * x * v - t * n * d + m * r * d,
        D = w * r * p - t * x * p - w * n * q + m * x * q + t * n * B - m * r * B,
        E = a * C + f * A + g * z + k * D;
      if (0 === E) {
        if (!0 === b) throw Error("THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0");
        console.warn("THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0");
        return this.identity()
      }
      b = 1 / E;
      c[0] = C * b;
      c[1] = (x * q * k - r * B * k - x * g * v + f * B * v + r * g * d - f * q * d) * b;
      c[2] = (n * B * k - x * p * k + x * g * l - f * B * l - n * g * d + f * p * d) * b;
      c[3] = (r * p * k - n * q * k - r * g * l + f * q * l + n * g * v - f * p * v) * b;
      c[4] = A * b;
      c[5] =
        (t * B * k - w * q * k + w * g * v - a * B * v - t * g * d + a * q * d) * b;
      c[6] = (w * p * k - m * B * k - w * g * l + a * B * l + m * g * d - a * p * d) * b;
      c[7] = (m * q * k - t * p * k + t * g * l - a * q * l - m * g * v + a * p * v) * b;
      c[8] = z * b;
      c[9] = (w * r * k - t * x * k - w * f * v + a * x * v + t * f * d - a * r * d) * b;
      c[10] = (m * x * k - w * n * k + w * f * l - a * x * l - m * f * d + a * n * d) * b;
      c[11] = (t * n * k - m * r * k - t * f * l + a * r * l + m * f * v - a * n * v) * b;
      c[12] = D * b;
      c[13] = (t * x * g - w * r * g + w * f * q - a * x * q - t * f * B + a * r * B) * b;
      c[14] = (w * n * g - m * x * g - w * f * p + a * x * p + m * f * B - a * n * B) * b;
      c[15] = (m * r * g - t * n * g + t * f * p - a * r * p - m * f * q + a * n * q) * b;
      return this
    },
    scale: function(a) {
      var b = this.elements,
        c = a.x,
        d = a.y;
      a = a.z;
      b[0] *= c;
      b[4] *= d;
      b[8] *= a;
      b[1] *= c;
      b[5] *= d;
      b[9] *= a;
      b[2] *= c;
      b[6] *= d;
      b[10] *= a;
      b[3] *= c;
      b[7] *= d;
      b[11] *= a;
      return this
    },
    getMaxScaleOnAxis: function() {
      var a = this.elements;
      return Math.sqrt(Math.max(a[0] * a[0] + a[1] * a[1] + a[2] * a[2], a[4] * a[4] + a[5] * a[5] + a[6] * a[6], a[8] * a[8] + a[9] * a[9] + a[10] * a[10]))
    },
    makeTranslation: function(a, b, c) {
      this.set(1, 0, 0, a, 0, 1, 0, b, 0, 0, 1, c, 0, 0, 0, 1);
      return this
    },
    makeRotationX: function(a) {
      var b = Math.cos(a);
      a = Math.sin(a);
      this.set(1, 0, 0, 0, 0, b, -a, 0, 0, a, b, 0, 0, 0, 0, 1);
      return this
    },
    makeRotationY: function(a) {
      var b =
        Math.cos(a);
      a = Math.sin(a);
      this.set(b, 0, a, 0, 0, 1, 0, 0, -a, 0, b, 0, 0, 0, 0, 1);
      return this
    },
    makeRotationZ: function(a) {
      var b = Math.cos(a);
      a = Math.sin(a);
      this.set(b, -a, 0, 0, a, b, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
      return this
    },
    makeRotationAxis: function(a, b) {
      var c = Math.cos(b);
      b = Math.sin(b);
      var d = 1 - c,
        f = a.x,
        g = a.y;
      a = a.z;
      var k = d * f,
        m = d * g;
      this.set(k * f + c, k * g - b * a, k * a + b * g, 0, k * g + b * a, m * g + c, m * a - b * f, 0, k * a - b * g, m * a + b * f, d * a * a + c, 0, 0, 0, 0, 1);
      return this
    },
    makeScale: function(a, b, c) {
      this.set(a, 0, 0, 0, 0, b, 0, 0, 0, 0, c, 0, 0, 0, 0, 1);
      return this
    },
    makeShear: function(a,
      b, c) {
      this.set(1, b, c, 0, a, 1, c, 0, a, b, 1, 0, 0, 0, 0, 1);
      return this
    },
    compose: function(a, b, c) {
      var d = this.elements,
        f = b._x,
        g = b._y,
        k = b._z,
        m = b._w,
        n = f + f,
        l = g + g,
        q = k + k;
      b = f * n;
      var t = f * l;
      f *= q;
      var r = g * l;
      g *= q;
      k *= q;
      n *= m;
      l *= m;
      m *= q;
      q = c.x;
      var u = c.y;
      c = c.z;
      d[0] = (1 - (r + k)) * q;
      d[1] = (t + m) * q;
      d[2] = (f - l) * q;
      d[3] = 0;
      d[4] = (t - m) * u;
      d[5] = (1 - (b + k)) * u;
      d[6] = (g + n) * u;
      d[7] = 0;
      d[8] = (f + l) * c;
      d[9] = (g - n) * c;
      d[10] = (1 - (b + r)) * c;
      d[11] = 0;
      d[12] = a.x;
      d[13] = a.y;
      d[14] = a.z;
      d[15] = 1;
      return this
    },
    decompose: function(a, b, c) {
      var d = this.elements,
        f = Na.set(d[0], d[1], d[2]).length(),
        g = Na.set(d[4], d[5], d[6]).length(),
        k = Na.set(d[8], d[9], d[10]).length();
      0 > this.determinant() && (f = -f);
      a.x = d[12];
      a.y = d[13];
      a.z = d[14];
      ea.copy(this);
      a = 1 / f;
      d = 1 / g;
      var m = 1 / k;
      ea.elements[0] *= a;
      ea.elements[1] *= a;
      ea.elements[2] *= a;
      ea.elements[4] *= d;
      ea.elements[5] *= d;
      ea.elements[6] *= d;
      ea.elements[8] *= m;
      ea.elements[9] *= m;
      ea.elements[10] *= m;
      b.setFromRotationMatrix(ea);
      c.x = f;
      c.y = g;
      c.z = k;
      return this
    },
    makePerspective: function(a, b, c, d, f, g) {
      void 0 === g && console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");
      var k = this.elements;
      k[0] = 2 * f / (b - a);
      k[4] = 0;
      k[8] = (b + a) / (b - a);
      k[12] = 0;
      k[1] = 0;
      k[5] = 2 * f / (c - d);
      k[9] = (c + d) / (c - d);
      k[13] = 0;
      k[2] = 0;
      k[6] = 0;
      k[10] = -(g + f) / (g - f);
      k[14] = -2 * g * f / (g - f);
      k[3] = 0;
      k[7] = 0;
      k[11] = -1;
      k[15] = 0;
      return this
    },
    makeOrthographic: function(a, b, c, d, f, g) {
      var k = this.elements,
        m = 1 / (b - a),
        n = 1 / (c - d),
        l = 1 / (g - f);
      k[0] = 2 * m;
      k[4] = 0;
      k[8] = 0;
      k[12] = -((b + a) * m);
      k[1] = 0;
      k[5] = 2 * n;
      k[9] = 0;
      k[13] = -((c + d) * n);
      k[2] = 0;
      k[6] = 0;
      k[10] = -2 * l;
      k[14] = -((g + f) * l);
      k[3] = 0;
      k[7] = 0;
      k[11] = 0;
      k[15] = 1;
      return this
    },
    equals: function(a) {
      var b = this.elements;
      a = a.elements;
      for (var c = 0; 16 > c; c++)
        if (b[c] !== a[c]) return !1;
      return !0
    },
    fromArray: function(a, b) {
      void 0 === b && (b = 0);
      for (var c = 0; 16 > c; c++) this.elements[c] = a[c + b];
      return this
    },
    toArray: function(a, b) {
      void 0 === a && (a = []);
      void 0 === b && (b = 0);
      var c = this.elements;
      a[b] = c[0];
      a[b + 1] = c[1];
      a[b + 2] = c[2];
      a[b + 3] = c[3];
      a[b + 4] = c[4];
      a[b + 5] = c[5];
      a[b + 6] = c[6];
      a[b + 7] = c[7];
      a[b + 8] = c[8];
      a[b + 9] = c[9];
      a[b + 10] = c[10];
      a[b + 11] = c[11];
      a[b + 12] = c[12];
      a[b + 13] = c[13];
      a[b + 14] = c[14];
      a[b + 15] = c[15];
      return a
    }
  });
  var hj = new I,
    ij = new ya;
  Zb.RotationOrders =
    "XYZ YZX ZXY XZY YXZ ZYX".split(" ");
  Zb.DefaultOrder = "XYZ";
  Object.defineProperties(Zb.prototype, {
    x: {
      get: function() {
        return this._x
      },
      set: function(a) {
        this._x = a;
        this._onChangeCallback()
      }
    },
    y: {
      get: function() {
        return this._y
      },
      set: function(a) {
        this._y = a;
        this._onChangeCallback()
      }
    },
    z: {
      get: function() {
        return this._z
      },
      set: function(a) {
        this._z = a;
        this._onChangeCallback()
      }
    },
    order: {
      get: function() {
        return this._order
      },
      set: function(a) {
        this._order = a;
        this._onChangeCallback()
      }
    }
  });
  Object.assign(Zb.prototype, {
    isEuler: !0,
    set: function(a,
      b, c, d) {
      this._x = a;
      this._y = b;
      this._z = c;
      this._order = d || this._order;
      this._onChangeCallback();
      return this
    },
    clone: function() {
      return new this.constructor(this._x, this._y, this._z, this._order)
    },
    copy: function(a) {
      this._x = a._x;
      this._y = a._y;
      this._z = a._z;
      this._order = a._order;
      this._onChangeCallback();
      return this
    },
    setFromRotationMatrix: function(a, b, c) {
      var d = N.clamp,
        f = a.elements;
      a = f[0];
      var g = f[4],
        k = f[8],
        m = f[1],
        n = f[5],
        l = f[9],
        q = f[2],
        t = f[6];
      f = f[10];
      b = b || this._order;
      "XYZ" === b ? (this._y = Math.asin(d(k, -1, 1)), .9999999 > Math.abs(k) ?
        (this._x = Math.atan2(-l, f), this._z = Math.atan2(-g, a)) : (this._x = Math.atan2(t, n), this._z = 0)) : "YXZ" === b ? (this._x = Math.asin(-d(l, -1, 1)), .9999999 > Math.abs(l) ? (this._y = Math.atan2(k, f), this._z = Math.atan2(m, n)) : (this._y = Math.atan2(-q, a), this._z = 0)) : "ZXY" === b ? (this._x = Math.asin(d(t, -1, 1)), .9999999 > Math.abs(t) ? (this._y = Math.atan2(-q, f), this._z = Math.atan2(-g, n)) : (this._y = 0, this._z = Math.atan2(m, a))) : "ZYX" === b ? (this._y = Math.asin(-d(q, -1, 1)), .9999999 > Math.abs(q) ? (this._x = Math.atan2(t, f), this._z = Math.atan2(m, a)) :
        (this._x = 0, this._z = Math.atan2(-g, n))) : "YZX" === b ? (this._z = Math.asin(d(m, -1, 1)), .9999999 > Math.abs(m) ? (this._x = Math.atan2(-l, n), this._y = Math.atan2(-q, a)) : (this._x = 0, this._y = Math.atan2(k, f))) : "XZY" === b ? (this._z = Math.asin(-d(g, -1, 1)), .9999999 > Math.abs(g) ? (this._x = Math.atan2(t, n), this._y = Math.atan2(k, a)) : (this._x = Math.atan2(-l, f), this._y = 0)) : console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: " + b);
      this._order = b;
      !1 !== c && this._onChangeCallback();
      return this
    },
    setFromQuaternion: function(a,
      b, c) {
      hj.makeRotationFromQuaternion(a);
      return this.setFromRotationMatrix(hj, b, c)
    },
    setFromVector3: function(a, b) {
      return this.set(a.x, a.y, a.z, b || this._order)
    },
    reorder: function(a) {
      ij.setFromEuler(this);
      return this.setFromQuaternion(ij, a)
    },
    equals: function(a) {
      return a._x === this._x && a._y === this._y && a._z === this._z && a._order === this._order
    },
    fromArray: function(a) {
      this._x = a[0];
      this._y = a[1];
      this._z = a[2];
      void 0 !== a[3] && (this._order = a[3]);
      this._onChangeCallback();
      return this
    },
    toArray: function(a, b) {
      void 0 === a && (a = []);
      void 0 === b && (b = 0);
      a[b] = this._x;
      a[b + 1] = this._y;
      a[b + 2] = this._z;
      a[b + 3] = this._order;
      return a
    },
    toVector3: function(a) {
      return a ? a.set(this._x, this._y, this._z) : new q(this._x, this._y, this._z)
    },
    _onChange: function(a) {
      this._onChangeCallback = a;
      return this
    },
    _onChangeCallback: function() {}
  });
  Object.assign(rg.prototype, {
    set: function(a) {
      this.mask = 1 << a | 0
    },
    enable: function(a) {
      this.mask = this.mask | 1 << a | 0
    },
    enableAll: function() {
      this.mask = -1
    },
    toggle: function(a) {
      this.mask ^= 1 << a | 0
    },
    disable: function(a) {
      this.mask &= ~(1 << a |
        0)
    },
    disableAll: function() {
      this.mask = 0
    },
    test: function(a) {
      return 0 !== (this.mask & a.mask)
    }
  });
  var Pj = 0,
    jj = new q,
    Bd = new ya,
    Cb = new I,
    Qf = new q,
    Oe = new q,
    Dl = new q,
    El = new ya,
    kj = new q(1, 0, 0),
    lj = new q(0, 1, 0),
    mj = new q(0, 0, 1),
    Fl = {
      type: "added"
    },
    Gl = {
      type: "removed"
    };
  E.DefaultUp = new q(0, 1, 0);
  E.DefaultMatrixAutoUpdate = !0;
  E.prototype = Object.assign(Object.create(Ra.prototype), {
    constructor: E,
    isObject3D: !0,
    onBeforeRender: function() {},
    onAfterRender: function() {},
    applyMatrix: function(a) {
      this.matrixAutoUpdate && this.updateMatrix();
      this.matrix.premultiply(a);
      this.matrix.decompose(this.position, this.quaternion, this.scale)
    },
    applyQuaternion: function(a) {
      this.quaternion.premultiply(a);
      return this
    },
    setRotationFromAxisAngle: function(a, b) {
      this.quaternion.setFromAxisAngle(a, b)
    },
    setRotationFromEuler: function(a) {
      this.quaternion.setFromEuler(a, !0)
    },
    setRotationFromMatrix: function(a) {
      this.quaternion.setFromRotationMatrix(a)
    },
    setRotationFromQuaternion: function(a) {
      this.quaternion.copy(a)
    },
    rotateOnAxis: function(a, b) {
      Bd.setFromAxisAngle(a, b);
      this.quaternion.multiply(Bd);
      return this
    },
    rotateOnWorldAxis: function(a, b) {
      Bd.setFromAxisAngle(a, b);
      this.quaternion.premultiply(Bd);
      return this
    },
    rotateX: function(a) {
      return this.rotateOnAxis(kj, a)
    },
    rotateY: function(a) {
      return this.rotateOnAxis(lj, a)
    },
    rotateZ: function(a) {
      return this.rotateOnAxis(mj, a)
    },
    translateOnAxis: function(a, b) {
      jj.copy(a).applyQuaternion(this.quaternion);
      this.position.add(jj.multiplyScalar(b));
      return this
    },
    translateX: function(a) {
      return this.translateOnAxis(kj, a)
    },
    translateY: function(a) {
      return this.translateOnAxis(lj,
        a)
    },
    translateZ: function(a) {
      return this.translateOnAxis(mj, a)
    },
    localToWorld: function(a) {
      return a.applyMatrix4(this.matrixWorld)
    },
    worldToLocal: function(a) {
      return a.applyMatrix4(Cb.getInverse(this.matrixWorld))
    },
    lookAt: function(a, b, c) {
      a.isVector3 ? Qf.copy(a) : Qf.set(a, b, c);
      a = this.parent;
      this.updateWorldMatrix(!0, !1);
      Oe.setFromMatrixPosition(this.matrixWorld);
      this.isCamera || this.isLight ? Cb.lookAt(Oe, Qf, this.up) : Cb.lookAt(Qf, Oe, this.up);
      this.quaternion.setFromRotationMatrix(Cb);
      a && (Cb.extractRotation(a.matrixWorld),
        Bd.setFromRotationMatrix(Cb), this.quaternion.premultiply(Bd.inverse()))
    },
    add: function(a) {
      if (1 < arguments.length) {
        for (var b = 0; b < arguments.length; b++) this.add(arguments[b]);
        return this
      }
      if (a === this) return console.error("THREE.Object3D.add: object can't be added as a child of itself.", a), this;
      a && a.isObject3D ? (null !== a.parent && a.parent.remove(a), a.parent = this, this.children.push(a), a.dispatchEvent(Fl)) : console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.", a);
      return this
    },
    remove: function(a) {
      if (1 <
        arguments.length) {
        for (var b = 0; b < arguments.length; b++) this.remove(arguments[b]);
        return this
      }
      b = this.children.indexOf(a); - 1 !== b && (a.parent = null, this.children.splice(b, 1), a.dispatchEvent(Gl));
      return this
    },
    attach: function(a) {
      this.updateWorldMatrix(!0, !1);
      Cb.getInverse(this.matrixWorld);
      null !== a.parent && (a.parent.updateWorldMatrix(!0, !1), Cb.multiply(a.parent.matrixWorld));
      a.applyMatrix(Cb);
      a.updateWorldMatrix(!1, !1);
      this.add(a);
      return this
    },
    getObjectById: function(a) {
      return this.getObjectByProperty("id",
        a)
    },
    getObjectByName: function(a) {
      return this.getObjectByProperty("name", a)
    },
    getObjectByProperty: function(a, b) {
      if (this[a] === b) return this;
      for (var c = 0, d = this.children.length; c < d; c++) {
        var f = this.children[c].getObjectByProperty(a, b);
        if (void 0 !== f) return f
      }
    },
    getWorldPosition: function(a) {
      void 0 === a && (console.warn("THREE.Object3D: .getWorldPosition() target is now required"), a = new q);
      this.updateMatrixWorld(!0);
      return a.setFromMatrixPosition(this.matrixWorld)
    },
    getWorldQuaternion: function(a) {
      void 0 === a && (console.warn("THREE.Object3D: .getWorldQuaternion() target is now required"),
        a = new ya);
      this.updateMatrixWorld(!0);
      this.matrixWorld.decompose(Oe, a, Dl);
      return a
    },
    getWorldScale: function(a) {
      void 0 === a && (console.warn("THREE.Object3D: .getWorldScale() target is now required"), a = new q);
      this.updateMatrixWorld(!0);
      this.matrixWorld.decompose(Oe, El, a);
      return a
    },
    getWorldDirection: function(a) {
      void 0 === a && (console.warn("THREE.Object3D: .getWorldDirection() target is now required"), a = new q);
      this.updateMatrixWorld(!0);
      var b = this.matrixWorld.elements;
      return a.set(b[8], b[9], b[10]).normalize()
    },
    raycast: function() {},
    traverse: function(a) {
      a(this);
      for (var b = this.children, c = 0, d = b.length; c < d; c++) b[c].traverse(a)
    },
    traverseVisible: function(a) {
      if (!1 !== this.visible) {
        a(this);
        for (var b = this.children, c = 0, d = b.length; c < d; c++) b[c].traverseVisible(a)
      }
    },
    traverseAncestors: function(a) {
      var b = this.parent;
      null !== b && (a(b), b.traverseAncestors(a))
    },
    updateMatrix: function() {
      this.matrix.compose(this.position, this.quaternion, this.scale);
      this.matrixWorldNeedsUpdate = !0
    },
    updateMatrixWorld: function(a) {
      this.matrixAutoUpdate &&
        this.updateMatrix();
      if (this.matrixWorldNeedsUpdate || a) null === this.parent ? this.matrixWorld.copy(this.matrix) : this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix), this.matrixWorldNeedsUpdate = !1, a = !0;
      for (var b = this.children, c = 0, d = b.length; c < d; c++) b[c].updateMatrixWorld(a)
    },
    updateWorldMatrix: function(a, b) {
      var c = this.parent;
      !0 === a && null !== c && c.updateWorldMatrix(!0, !1);
      this.matrixAutoUpdate && this.updateMatrix();
      null === this.parent ? this.matrixWorld.copy(this.matrix) : this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,
        this.matrix);
      if (!0 === b)
        for (a = this.children, b = 0, c = a.length; b < c; b++) a[b].updateWorldMatrix(!1, !0)
    },
    toJSON: function(a) {
      function b(b, c) {
        void 0 === b[c.uuid] && (b[c.uuid] = c.toJSON(a));
        return c.uuid
      }

      function c(a) {
        var b = [],
          c;
        for (c in a) {
          var d = a[c];
          delete d.metadata;
          b.push(d)
        }
        return b
      }
      var d = void 0 === a || "string" === typeof a,
        f = {};
      d && (a = {
        geometries: {},
        materials: {},
        textures: {},
        images: {},
        shapes: {}
      }, f.metadata = {
        version: 4.5,
        type: "Object",
        generator: "Object3D.toJSON"
      });
      var g = {};
      g.uuid = this.uuid;
      g.type = this.type;
      "" !==
      this.name && (g.name = this.name);
      !0 === this.castShadow && (g.castShadow = !0);
      !0 === this.receiveShadow && (g.receiveShadow = !0);
      !1 === this.visible && (g.visible = !1);
      !1 === this.frustumCulled && (g.frustumCulled = !1);
      0 !== this.renderOrder && (g.renderOrder = this.renderOrder);
      "{}" !== JSON.stringify(this.userData) && (g.userData = this.userData);
      g.layers = this.layers.mask;
      g.matrix = this.matrix.toArray();
      !1 === this.matrixAutoUpdate && (g.matrixAutoUpdate = !1);
      this.isMesh && 0 !== this.drawMode && (g.drawMode = this.drawMode);
      this.isInstancedMesh &&
        (g.type = "InstancedMesh", g.count = this.count, g.instanceMatrix = this.instanceMatrix.toJSON());
      if (this.isMesh || this.isLine || this.isPoints) {
        g.geometry = b(a.geometries, this.geometry);
        var k = this.geometry.parameters;
        if (void 0 !== k && void 0 !== k.shapes)
          if (k = k.shapes, Array.isArray(k))
            for (var m = 0, n = k.length; m < n; m++) b(a.shapes, k[m]);
          else b(a.shapes, k)
      }
      if (void 0 !== this.material)
        if (Array.isArray(this.material)) {
          k = [];
          m = 0;
          for (n = this.material.length; m < n; m++) k.push(b(a.materials, this.material[m]));
          g.material = k
        } else g.material =
          b(a.materials, this.material);
      if (0 < this.children.length)
        for (g.children = [], m = 0; m < this.children.length; m++) g.children.push(this.children[m].toJSON(a).object);
      if (d) {
        d = c(a.geometries);
        m = c(a.materials);
        n = c(a.textures);
        var l = c(a.images);
        k = c(a.shapes);
        0 < d.length && (f.geometries = d);
        0 < m.length && (f.materials = m);
        0 < n.length && (f.textures = n);
        0 < l.length && (f.images = l);
        0 < k.length && (f.shapes = k)
      }
      f.object = g;
      return f
    },
    clone: function(a) {
      return (new this.constructor).copy(this, a)
    },
    copy: function(a, b) {
      void 0 === b && (b = !0);
      this.name =
        a.name;
      this.up.copy(a.up);
      this.position.copy(a.position);
      this.quaternion.copy(a.quaternion);
      this.scale.copy(a.scale);
      this.matrix.copy(a.matrix);
      this.matrixWorld.copy(a.matrixWorld);
      this.matrixAutoUpdate = a.matrixAutoUpdate;
      this.matrixWorldNeedsUpdate = a.matrixWorldNeedsUpdate;
      this.layers.mask = a.layers.mask;
      this.visible = a.visible;
      this.castShadow = a.castShadow;
      this.receiveShadow = a.receiveShadow;
      this.frustumCulled = a.frustumCulled;
      this.renderOrder = a.renderOrder;
      this.userData = JSON.parse(JSON.stringify(a.userData));
      if (!0 === b)
        for (b = 0; b < a.children.length; b++) this.add(a.children[b].clone());
      return this
    }
  });
  Kd.prototype = Object.assign(Object.create(E.prototype), {
    constructor: Kd,
    isScene: !0,
    copy: function(a, b) {
      E.prototype.copy.call(this, a, b);
      null !== a.background && (this.background = a.background.clone());
      null !== a.fog && (this.fog = a.fog.clone());
      null !== a.overrideMaterial && (this.overrideMaterial = a.overrideMaterial.clone());
      this.autoUpdate = a.autoUpdate;
      this.matrixAutoUpdate = a.matrixAutoUpdate;
      return this
    },
    toJSON: function(a) {
      var b =
        E.prototype.toJSON.call(this, a);
      null !== this.background && (b.object.background = this.background.toJSON(a));
      null !== this.fog && (b.object.fog = this.fog.toJSON());
      return b
    },
    dispose: function() {
      this.dispatchEvent({
        type: "dispose"
      })
    }
  });
  var Db = [new q, new q, new q, new q, new q, new q, new q, new q],
    ob = new q,
    Cd = new q,
    Dd = new q,
    Ed = new q,
    Sb = new q,
    Tb = new q,
    Cc = new q,
    Pe = new q,
    Rf = new q,
    Sf = new q,
    $b = new q;
  Object.assign(gb.prototype, {
    isBox3: !0,
    set: function(a, b) {
      this.min.copy(a);
      this.max.copy(b);
      return this
    },
    setFromArray: function(a) {
      for (var b =
          Infinity, c = Infinity, d = Infinity, f = -Infinity, g = -Infinity, k = -Infinity, m = 0, n = a.length; m < n; m += 3) {
        var l = a[m],
          q = a[m + 1],
          t = a[m + 2];
        l < b && (b = l);
        q < c && (c = q);
        t < d && (d = t);
        l > f && (f = l);
        q > g && (g = q);
        t > k && (k = t)
      }
      this.min.set(b, c, d);
      this.max.set(f, g, k);
      return this
    },
    setFromBufferAttribute: function(a) {
      for (var b = Infinity, c = Infinity, d = Infinity, f = -Infinity, g = -Infinity, k = -Infinity, m = 0, n = a.count; m < n; m++) {
        var l = a.getX(m),
          q = a.getY(m),
          t = a.getZ(m);
        l < b && (b = l);
        q < c && (c = q);
        t < d && (d = t);
        l > f && (f = l);
        q > g && (g = q);
        t > k && (k = t)
      }
      this.min.set(b, c, d);
      this.max.set(f, g, k);
      return this
    },
    setFromPoints: function(a) {
      this.makeEmpty();
      for (var b = 0, c = a.length; b < c; b++) this.expandByPoint(a[b]);
      return this
    },
    setFromCenterAndSize: function(a, b) {
      b = ob.copy(b).multiplyScalar(.5);
      this.min.copy(a).sub(b);
      this.max.copy(a).add(b);
      return this
    },
    setFromObject: function(a) {
      this.makeEmpty();
      return this.expandByObject(a)
    },
    clone: function() {
      return (new this.constructor).copy(this)
    },
    copy: function(a) {
      this.min.copy(a.min);
      this.max.copy(a.max);
      return this
    },
    makeEmpty: function() {
      this.min.x =
        this.min.y = this.min.z = Infinity;
      this.max.x = this.max.y = this.max.z = -Infinity;
      return this
    },
    isEmpty: function() {
      return this.max.x < this.min.x || this.max.y < this.min.y || this.max.z < this.min.z
    },
    getCenter: function(a) {
      void 0 === a && (console.warn("THREE.Box3: .getCenter() target is now required"), a = new q);
      return this.isEmpty() ? a.set(0, 0, 0) : a.addVectors(this.min, this.max).multiplyScalar(.5)
    },
    getSize: function(a) {
      void 0 === a && (console.warn("THREE.Box3: .getSize() target is now required"), a = new q);
      return this.isEmpty() ?
        a.set(0, 0, 0) : a.subVectors(this.max, this.min)
    },
    expandByPoint: function(a) {
      this.min.min(a);
      this.max.max(a);
      return this
    },
    expandByVector: function(a) {
      this.min.sub(a);
      this.max.add(a);
      return this
    },
    expandByScalar: function(a) {
      this.min.addScalar(-a);
      this.max.addScalar(a);
      return this
    },
    expandByObject: function(a) {
      var b;
      a.updateWorldMatrix(!1, !1);
      var c = a.geometry;
      if (void 0 !== c)
        if (c.isGeometry) {
          var d = c.vertices;
          c = 0;
          for (b = d.length; c < b; c++) ob.copy(d[c]), ob.applyMatrix4(a.matrixWorld), this.expandByPoint(ob)
        } else if (c.isBufferGeometry &&
        (d = c.attributes.position, void 0 !== d))
        for (c = 0, b = d.count; c < b; c++) ob.fromBufferAttribute(d, c).applyMatrix4(a.matrixWorld), this.expandByPoint(ob);
      a = a.children;
      c = 0;
      for (b = a.length; c < b; c++) this.expandByObject(a[c]);
      return this
    },
    containsPoint: function(a) {
      return a.x < this.min.x || a.x > this.max.x || a.y < this.min.y || a.y > this.max.y || a.z < this.min.z || a.z > this.max.z ? !1 : !0
    },
    containsBox: function(a) {
      return this.min.x <= a.min.x && a.max.x <= this.max.x && this.min.y <= a.min.y && a.max.y <= this.max.y && this.min.z <= a.min.z && a.max.z <=
        this.max.z
    },
    getParameter: function(a, b) {
      void 0 === b && (console.warn("THREE.Box3: .getParameter() target is now required"), b = new q);
      return b.set((a.x - this.min.x) / (this.max.x - this.min.x), (a.y - this.min.y) / (this.max.y - this.min.y), (a.z - this.min.z) / (this.max.z - this.min.z))
    },
    intersectsBox: function(a) {
      return a.max.x < this.min.x || a.min.x > this.max.x || a.max.y < this.min.y || a.min.y > this.max.y || a.max.z < this.min.z || a.min.z > this.max.z ? !1 : !0
    },
    intersectsSphere: function(a) {
      this.clampPoint(a.center, ob);
      return ob.distanceToSquared(a.center) <=
        a.radius * a.radius
    },
    intersectsPlane: function(a) {
      if (0 < a.normal.x) {
        var b = a.normal.x * this.min.x;
        var c = a.normal.x * this.max.x
      } else b = a.normal.x * this.max.x, c = a.normal.x * this.min.x;
      0 < a.normal.y ? (b += a.normal.y * this.min.y, c += a.normal.y * this.max.y) : (b += a.normal.y * this.max.y, c += a.normal.y * this.min.y);
      0 < a.normal.z ? (b += a.normal.z * this.min.z, c += a.normal.z * this.max.z) : (b += a.normal.z * this.max.z, c += a.normal.z * this.min.z);
      return b <= -a.constant && c >= -a.constant
    },
    intersectsTriangle: function(a) {
      if (this.isEmpty()) return !1;
      this.getCenter(Pe);
      Rf.subVectors(this.max, Pe);
      Cd.subVectors(a.a, Pe);
      Dd.subVectors(a.b, Pe);
      Ed.subVectors(a.c, Pe);
      Sb.subVectors(Dd, Cd);
      Tb.subVectors(Ed, Dd);
      Cc.subVectors(Cd, Ed);
      a = [0, -Sb.z, Sb.y, 0, -Tb.z, Tb.y, 0, -Cc.z, Cc.y, Sb.z, 0, -Sb.x, Tb.z, 0, -Tb.x, Cc.z, 0, -Cc.x, -Sb.y, Sb.x, 0, -Tb.y, Tb.x, 0, -Cc.y, Cc.x, 0];
      if (!sg(a, Cd, Dd, Ed, Rf)) return !1;
      a = [1, 0, 0, 0, 1, 0, 0, 0, 1];
      if (!sg(a, Cd, Dd, Ed, Rf)) return !1;
      Sf.crossVectors(Sb, Tb);
      a = [Sf.x, Sf.y, Sf.z];
      return sg(a, Cd, Dd, Ed, Rf)
    },
    clampPoint: function(a, b) {
      void 0 === b && (console.warn("THREE.Box3: .clampPoint() target is now required"),
        b = new q);
      return b.copy(a).clamp(this.min, this.max)
    },
    distanceToPoint: function(a) {
      return ob.copy(a).clamp(this.min, this.max).sub(a).length()
    },
    getBoundingSphere: function(a) {
      void 0 === a && console.error("THREE.Box3: .getBoundingSphere() target is now required");
      this.getCenter(a.center);
      a.radius = .5 * this.getSize(ob).length();
      return a
    },
    intersect: function(a) {
      this.min.max(a.min);
      this.max.min(a.max);
      this.isEmpty() && this.makeEmpty();
      return this
    },
    union: function(a) {
      this.min.min(a.min);
      this.max.max(a.max);
      return this
    },
    applyMatrix4: function(a) {
      if (this.isEmpty()) return this;
      Db[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(a);
      Db[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(a);
      Db[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(a);
      Db[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(a);
      Db[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(a);
      Db[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(a);
      Db[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(a);
      Db[7].set(this.max.x, this.max.y,
        this.max.z).applyMatrix4(a);
      this.setFromPoints(Db);
      return this
    },
    translate: function(a) {
      this.min.add(a);
      this.max.add(a);
      return this
    },
    equals: function(a) {
      return a.min.equals(this.min) && a.max.equals(this.max)
    }
  });
  var Hl = new gb;
  Object.assign(ub.prototype, {
    set: function(a, b) {
      this.center.copy(a);
      this.radius = b;
      return this
    },
    setFromPoints: function(a, b) {
      var c = this.center;
      void 0 !== b ? c.copy(b) : Hl.setFromPoints(a).getCenter(c);
      for (var d = b = 0, f = a.length; d < f; d++) b = Math.max(b, c.distanceToSquared(a[d]));
      this.radius = Math.sqrt(b);
      return this
    },
    clone: function() {
      return (new this.constructor).copy(this)
    },
    copy: function(a) {
      this.center.copy(a.center);
      this.radius = a.radius;
      return this
    },
    empty: function() {
      return 0 >= this.radius
    },
    containsPoint: function(a) {
      return a.distanceToSquared(this.center) <= this.radius * this.radius
    },
    distanceToPoint: function(a) {
      return a.distanceTo(this.center) - this.radius
    },
    intersectsSphere: function(a) {
      var b = this.radius + a.radius;
      return a.center.distanceToSquared(this.center) <= b * b
    },
    intersectsBox: function(a) {
      return a.intersectsSphere(this)
    },
    intersectsPlane: function(a) {
      return Math.abs(a.distanceToPoint(this.center)) <= this.radius
    },
    clampPoint: function(a, b) {
      var c = this.center.distanceToSquared(a);
      void 0 === b && (console.warn("THREE.Sphere: .clampPoint() target is now required"), b = new q);
      b.copy(a);
      c > this.radius * this.radius && (b.sub(this.center).normalize(), b.multiplyScalar(this.radius).add(this.center));
      return b
    },
    getBoundingBox: function(a) {
      void 0 === a && (console.warn("THREE.Sphere: .getBoundingBox() target is now required"), a = new gb);
      a.set(this.center,
        this.center);
      a.expandByScalar(this.radius);
      return a
    },
    applyMatrix4: function(a) {
      this.center.applyMatrix4(a);
      this.radius *= a.getMaxScaleOnAxis();
      return this
    },
    translate: function(a) {
      this.center.add(a);
      return this
    },
    equals: function(a) {
      return a.center.equals(this.center) && a.radius === this.radius
    }
  });
  var Eb = new q,
    sh = new q,
    Tf = new q,
    Ub = new q,
    th = new q,
    Uf = new q,
    uh = new q;
  Object.assign(ac.prototype, {
    set: function(a, b) {
      this.origin.copy(a);
      this.direction.copy(b);
      return this
    },
    clone: function() {
      return (new this.constructor).copy(this)
    },
    copy: function(a) {
      this.origin.copy(a.origin);
      this.direction.copy(a.direction);
      return this
    },
    at: function(a, b) {
      void 0 === b && (console.warn("THREE.Ray: .at() target is now required"), b = new q);
      return b.copy(this.direction).multiplyScalar(a).add(this.origin)
    },
    lookAt: function(a) {
      this.direction.copy(a).sub(this.origin).normalize();
      return this
    },
    recast: function(a) {
      this.origin.copy(this.at(a, Eb));
      return this
    },
    closestPointToPoint: function(a, b) {
      void 0 === b && (console.warn("THREE.Ray: .closestPointToPoint() target is now required"),
        b = new q);
      b.subVectors(a, this.origin);
      a = b.dot(this.direction);
      return 0 > a ? b.copy(this.origin) : b.copy(this.direction).multiplyScalar(a).add(this.origin)
    },
    distanceToPoint: function(a) {
      return Math.sqrt(this.distanceSqToPoint(a))
    },
    distanceSqToPoint: function(a) {
      var b = Eb.subVectors(a, this.origin).dot(this.direction);
      if (0 > b) return this.origin.distanceToSquared(a);
      Eb.copy(this.direction).multiplyScalar(b).add(this.origin);
      return Eb.distanceToSquared(a)
    },
    distanceSqToSegment: function(a, b, c, d) {
      sh.copy(a).add(b).multiplyScalar(.5);
      Tf.copy(b).sub(a).normalize();
      Ub.copy(this.origin).sub(sh);
      var f = .5 * a.distanceTo(b),
        g = -this.direction.dot(Tf),
        k = Ub.dot(this.direction),
        m = -Ub.dot(Tf),
        n = Ub.lengthSq(),
        l = Math.abs(1 - g * g);
      if (0 < l) {
        a = g * m - k;
        b = g * k - m;
        var q = f * l;
        0 <= a ? b >= -q ? b <= q ? (f = 1 / l, a *= f, b *= f, g = a * (a + g * b + 2 * k) + b * (g * a + b + 2 * m) + n) : (b = f, a = Math.max(0, -(g * b + k)), g = -a * a + b * (b + 2 * m) + n) : (b = -f, a = Math.max(0, -(g * b + k)), g = -a * a + b * (b + 2 * m) + n) : b <= -q ? (a = Math.max(0, -(-g * f + k)), b = 0 < a ? -f : Math.min(Math.max(-f, -m), f), g = -a * a + b * (b + 2 * m) + n) : b <= q ? (a = 0, b = Math.min(Math.max(-f, -m), f), g = b * (b + 2 * m) + n) : (a = Math.max(0, -(g * f + k)), b = 0 < a ? f : Math.min(Math.max(-f, -m), f), g = -a * a + b * (b + 2 * m) + n)
      } else b = 0 < g ? -f : f, a = Math.max(0, -(g * b + k)), g = -a * a + b * (b + 2 * m) + n;
      c && c.copy(this.direction).multiplyScalar(a).add(this.origin);
      d && d.copy(Tf).multiplyScalar(b).add(sh);
      return g
    },
    intersectSphere: function(a, b) {
      Eb.subVectors(a.center, this.origin);
      var c = Eb.dot(this.direction),
        d = Eb.dot(Eb) - c * c;
      a = a.radius * a.radius;
      if (d > a) return null;
      a = Math.sqrt(a - d);
      d = c - a;
      c += a;
      return 0 > d && 0 > c ? null : 0 > d ? this.at(c, b) : this.at(d, b)
    },
    intersectsSphere: function(a) {
      return this.distanceSqToPoint(a.center) <= a.radius * a.radius
    },
    distanceToPlane: function(a) {
      var b = a.normal.dot(this.direction);
      if (0 === b) return 0 === a.distanceToPoint(this.origin) ? 0 : null;
      a = -(this.origin.dot(a.normal) + a.constant) / b;
      return 0 <= a ? a : null
    },
    intersectPlane: function(a, b) {
      a = this.distanceToPlane(a);
      return null === a ? null : this.at(a, b)
    },
    intersectsPlane: function(a) {
      var b = a.distanceToPoint(this.origin);
      return 0 === b || 0 > a.normal.dot(this.direction) * b ? !0 : !1
    },
    intersectBox: function(a,
      b) {
      var c = 1 / this.direction.x;
      var d = 1 / this.direction.y;
      var f = 1 / this.direction.z,
        g = this.origin;
      if (0 <= c) {
        var k = (a.min.x - g.x) * c;
        c *= a.max.x - g.x
      } else k = (a.max.x - g.x) * c, c *= a.min.x - g.x;
      if (0 <= d) {
        var m = (a.min.y - g.y) * d;
        d *= a.max.y - g.y
      } else m = (a.max.y - g.y) * d, d *= a.min.y - g.y;
      if (k > d || m > c) return null;
      if (m > k || k !== k) k = m;
      if (d < c || c !== c) c = d;
      0 <= f ? (m = (a.min.z - g.z) * f, a = (a.max.z - g.z) * f) : (m = (a.max.z - g.z) * f, a = (a.min.z - g.z) * f);
      if (k > a || m > c) return null;
      if (m > k || k !== k) k = m;
      if (a < c || c !== c) c = a;
      return 0 > c ? null : this.at(0 <= k ? k : c, b)
    },
    intersectsBox: function(a) {
      return null !==
        this.intersectBox(a, Eb)
    },
    intersectTriangle: function(a, b, c, d, f) {
      th.subVectors(b, a);
      Uf.subVectors(c, a);
      uh.crossVectors(th, Uf);
      b = this.direction.dot(uh);
      if (0 < b) {
        if (d) return null;
        d = 1
      } else if (0 > b) d = -1, b = -b;
      else return null;
      Ub.subVectors(this.origin, a);
      a = d * this.direction.dot(Uf.crossVectors(Ub, Uf));
      if (0 > a) return null;
      c = d * this.direction.dot(th.cross(Ub));
      if (0 > c || a + c > b) return null;
      a = -d * Ub.dot(uh);
      return 0 > a ? null : this.at(a / b, f)
    },
    applyMatrix4: function(a) {
      this.origin.applyMatrix4(a);
      this.direction.transformDirection(a);
      return this
    },
    equals: function(a) {
      return a.origin.equals(this.origin) && a.direction.equals(this.direction)
    }
  });
  var vh = new q,
    Il = new q,
    Jl = new ka;
  Object.assign(Sa.prototype, {
    isPlane: !0,
    set: function(a, b) {
      this.normal.copy(a);
      this.constant = b;
      return this
    },
    setComponents: function(a, b, c, d) {
      this.normal.set(a, b, c);
      this.constant = d;
      return this
    },
    setFromNormalAndCoplanarPoint: function(a, b) {
      this.normal.copy(a);
      this.constant = -b.dot(this.normal);
      return this
    },
    setFromCoplanarPoints: function(a, b, c) {
      b = vh.subVectors(c, b).cross(Il.subVectors(a,
        b)).normalize();
      this.setFromNormalAndCoplanarPoint(b, a);
      return this
    },
    clone: function() {
      return (new this.constructor).copy(this)
    },
    copy: function(a) {
      this.normal.copy(a.normal);
      this.constant = a.constant;
      return this
    },
    normalize: function() {
      var a = 1 / this.normal.length();
      this.normal.multiplyScalar(a);
      this.constant *= a;
      return this
    },
    negate: function() {
      this.constant *= -1;
      this.normal.negate();
      return this
    },
    distanceToPoint: function(a) {
      return this.normal.dot(a) + this.constant
    },
    distanceToSphere: function(a) {
      return this.distanceToPoint(a.center) -
        a.radius
    },
    projectPoint: function(a, b) {
      void 0 === b && (console.warn("THREE.Plane: .projectPoint() target is now required"), b = new q);
      return b.copy(this.normal).multiplyScalar(-this.distanceToPoint(a)).add(a)
    },
    intersectLine: function(a, b) {
      void 0 === b && (console.warn("THREE.Plane: .intersectLine() target is now required"), b = new q);
      var c = a.delta(vh),
        d = this.normal.dot(c);
      if (0 === d) {
        if (0 === this.distanceToPoint(a.start)) return b.copy(a.start)
      } else if (d = -(a.start.dot(this.normal) + this.constant) / d, !(0 > d || 1 < d)) return b.copy(c).multiplyScalar(d).add(a.start)
    },
    intersectsLine: function(a) {
      var b = this.distanceToPoint(a.start);
      a = this.distanceToPoint(a.end);
      return 0 > b && 0 < a || 0 > a && 0 < b
    },
    intersectsBox: function(a) {
      return a.intersectsPlane(this)
    },
    intersectsSphere: function(a) {
      return a.intersectsPlane(this)
    },
    coplanarPoint: function(a) {
      void 0 === a && (console.warn("THREE.Plane: .coplanarPoint() target is now required"), a = new q);
      return a.copy(this.normal).multiplyScalar(-this.constant)
    },
    applyMatrix4: function(a, b) {
      b = b || Jl.getNormalMatrix(a);
      a = this.coplanarPoint(vh).applyMatrix4(a);
      b = this.normal.applyMatrix3(b).normalize();
      this.constant = -a.dot(b);
      return this
    },
    translate: function(a) {
      this.constant -= a.dot(this.normal);
      return this
    },
    equals: function(a) {
      return a.normal.equals(this.normal) && a.constant === this.constant
    }
  });
  var cb = new q,
    Fb = new q,
    wh = new q,
    Gb = new q,
    Fd = new q,
    Gd = new q,
    nj = new q,
    xh = new q,
    yh = new q,
    zh = new q;
  Object.assign(va, {
    getNormal: function(a, b, c, d) {
      void 0 === d && (console.warn("THREE.Triangle: .getNormal() target is now required"), d = new q);
      d.subVectors(c, b);
      cb.subVectors(a, b);
      d.cross(cb);
      a = d.lengthSq();
      return 0 < a ? d.multiplyScalar(1 / Math.sqrt(a)) : d.set(0, 0, 0)
    },
    getBarycoord: function(a, b, c, d, f) {
      cb.subVectors(d, b);
      Fb.subVectors(c, b);
      wh.subVectors(a, b);
      a = cb.dot(cb);
      b = cb.dot(Fb);
      c = cb.dot(wh);
      var g = Fb.dot(Fb);
      d = Fb.dot(wh);
      var k = a * g - b * b;
      void 0 === f && (console.warn("THREE.Triangle: .getBarycoord() target is now required"), f = new q);
      if (0 === k) return f.set(-2, -1, -1);
      k = 1 / k;
      g = (g * c - b * d) * k;
      a = (a * d - b * c) * k;
      return f.set(1 - g - a, a, g)
    },
    containsPoint: function(a, b, c, d) {
      va.getBarycoord(a, b, c, d, Gb);
      return 0 <= Gb.x && 0 <= Gb.y && 1 >= Gb.x + Gb.y
    },
    getUV: function(a, b, c, d, f, g, k, m) {
      this.getBarycoord(a, b, c, d, Gb);
      m.set(0, 0);
      m.addScaledVector(f, Gb.x);
      m.addScaledVector(g, Gb.y);
      m.addScaledVector(k, Gb.z);
      return m
    },
    isFrontFacing: function(a, b, c, d) {
      cb.subVectors(c, b);
      Fb.subVectors(a, b);
      return 0 > cb.cross(Fb).dot(d) ? !0 : !1
    }
  });
  Object.assign(va.prototype, {
    set: function(a, b, c) {
      this.a.copy(a);
      this.b.copy(b);
      this.c.copy(c);
      return this
    },
    setFromPointsAndIndices: function(a, b, c, d) {
      this.a.copy(a[b]);
      this.b.copy(a[c]);
      this.c.copy(a[d]);
      return this
    },
    clone: function() {
      return (new this.constructor).copy(this)
    },
    copy: function(a) {
      this.a.copy(a.a);
      this.b.copy(a.b);
      this.c.copy(a.c);
      return this
    },
    getArea: function() {
      cb.subVectors(this.c, this.b);
      Fb.subVectors(this.a, this.b);
      return .5 * cb.cross(Fb).length()
    },
    getMidpoint: function(a) {
      void 0 === a && (console.warn("THREE.Triangle: .getMidpoint() target is now required"), a = new q);
      return a.addVectors(this.a, this.b).add(this.c).multiplyScalar(1 / 3)
    },
    getNormal: function(a) {
      return va.getNormal(this.a, this.b,
        this.c, a)
    },
    getPlane: function(a) {
      void 0 === a && (console.warn("THREE.Triangle: .getPlane() target is now required"), a = new Sa);
      return a.setFromCoplanarPoints(this.a, this.b, this.c)
    },
    getBarycoord: function(a, b) {
      return va.getBarycoord(a, this.a, this.b, this.c, b)
    },
    getUV: function(a, b, c, d, f) {
      return va.getUV(a, this.a, this.b, this.c, b, c, d, f)
    },
    containsPoint: function(a) {
      return va.containsPoint(a, this.a, this.b, this.c)
    },
    isFrontFacing: function(a) {
      return va.isFrontFacing(this.a, this.b, this.c, a)
    },
    intersectsBox: function(a) {
      return a.intersectsTriangle(this)
    },
    closestPointToPoint: function(a, b) {
      void 0 === b && (console.warn("THREE.Triangle: .closestPointToPoint() target is now required"), b = new q);
      var c = this.a,
        d = this.b,
        f = this.c;
      Fd.subVectors(d, c);
      Gd.subVectors(f, c);
      xh.subVectors(a, c);
      var g = Fd.dot(xh),
        k = Gd.dot(xh);
      if (0 >= g && 0 >= k) return b.copy(c);
      yh.subVectors(a, d);
      var m = Fd.dot(yh),
        n = Gd.dot(yh);
      if (0 <= m && n <= m) return b.copy(d);
      var l = g * n - m * k;
      if (0 >= l && 0 <= g && 0 >= m) return d = g / (g - m), b.copy(c).addScaledVector(Fd, d);
      zh.subVectors(a, f);
      a = Fd.dot(zh);
      var y = Gd.dot(zh);
      if (0 <=
        y && a <= y) return b.copy(f);
      g = a * k - g * y;
      if (0 >= g && 0 <= k && 0 >= y) return l = k / (k - y), b.copy(c).addScaledVector(Gd, l);
      k = m * y - a * n;
      if (0 >= k && 0 <= n - m && 0 <= a - y) return nj.subVectors(f, d), l = (n - m) / (n - m + (a - y)), b.copy(d).addScaledVector(nj, l);
      f = 1 / (k + g + l);
      d = g * f;
      l *= f;
      return b.copy(c).addScaledVector(Fd, d).addScaledVector(Gd, l)
    },
    equals: function(a) {
      return a.a.equals(this.a) && a.b.equals(this.b) && a.c.equals(this.c)
    }
  });
  var oj = {
      aliceblue: 15792383,
      antiquewhite: 16444375,
      aqua: 65535,
      aquamarine: 8388564,
      azure: 15794175,
      beige: 16119260,
      bisque: 16770244,
      black: 0,
      blanchedalmond: 16772045,
      blue: 255,
      blueviolet: 9055202,
      brown: 10824234,
      burlywood: 14596231,
      cadetblue: 6266528,
      chartreuse: 8388352,
      chocolate: 13789470,
      coral: 16744272,
      cornflowerblue: 6591981,
      cornsilk: 16775388,
      crimson: 14423100,
      cyan: 65535,
      darkblue: 139,
      darkcyan: 35723,
      darkgoldenrod: 12092939,
      darkgray: 11119017,
      darkgreen: 25600,
      darkgrey: 11119017,
      darkkhaki: 12433259,
      darkmagenta: 9109643,
      darkolivegreen: 5597999,
      darkorange: 16747520,
      darkorchid: 10040012,
      darkred: 9109504,
      darksalmon: 15308410,
      darkseagreen: 9419919,
      darkslateblue: 4734347,
      darkslategray: 3100495,
      darkslategrey: 3100495,
      darkturquoise: 52945,
      darkviolet: 9699539,
      deeppink: 16716947,
      deepskyblue: 49151,
      dimgray: 6908265,
      dimgrey: 6908265,
      dodgerblue: 2003199,
      firebrick: 11674146,
      floralwhite: 16775920,
      forestgreen: 2263842,
      fuchsia: 16711935,
      gainsboro: 14474460,
      ghostwhite: 16316671,
      gold: 16766720,
      goldenrod: 14329120,
      gray: 8421504,
      green: 32768,
      greenyellow: 11403055,
      grey: 8421504,
      honeydew: 15794160,
      hotpink: 16738740,
      indianred: 13458524,
      indigo: 4915330,
      ivory: 16777200,
      khaki: 15787660,
      lavender: 15132410,
      lavenderblush: 16773365,
      lawngreen: 8190976,
      lemonchiffon: 16775885,
      lightblue: 11393254,
      lightcoral: 15761536,
      lightcyan: 14745599,
      lightgoldenrodyellow: 16448210,
      lightgray: 13882323,
      lightgreen: 9498256,
      lightgrey: 13882323,
      lightpink: 16758465,
      lightsalmon: 16752762,
      lightseagreen: 2142890,
      lightskyblue: 8900346,
      lightslategray: 7833753,
      lightslategrey: 7833753,
      lightsteelblue: 11584734,
      lightyellow: 16777184,
      lime: 65280,
      limegreen: 3329330,
      linen: 16445670,
      magenta: 16711935,
      maroon: 8388608,
      mediumaquamarine: 6737322,
      mediumblue: 205,
      mediumorchid: 12211667,
      mediumpurple: 9662683,
      mediumseagreen: 3978097,
      mediumslateblue: 8087790,
      mediumspringgreen: 64154,
      mediumturquoise: 4772300,
      mediumvioletred: 13047173,
      midnightblue: 1644912,
      mintcream: 16121850,
      mistyrose: 16770273,
      moccasin: 16770229,
      navajowhite: 16768685,
      navy: 128,
      oldlace: 16643558,
      olive: 8421376,
      olivedrab: 7048739,
      orange: 16753920,
      orangered: 16729344,
      orchid: 14315734,
      palegoldenrod: 15657130,
      palegreen: 10025880,
      paleturquoise: 11529966,
      palevioletred: 14381203,
      papayawhip: 16773077,
      peachpuff: 16767673,
      peru: 13468991,
      pink: 16761035,
      plum: 14524637,
      powderblue: 11591910,
      purple: 8388736,
      rebeccapurple: 6697881,
      red: 16711680,
      rosybrown: 12357519,
      royalblue: 4286945,
      saddlebrown: 9127187,
      salmon: 16416882,
      sandybrown: 16032864,
      seagreen: 3050327,
      seashell: 16774638,
      sienna: 10506797,
      silver: 12632256,
      skyblue: 8900331,
      slateblue: 6970061,
      slategray: 7372944,
      slategrey: 7372944,
      snow: 16775930,
      springgreen: 65407,
      steelblue: 4620980,
      tan: 13808780,
      teal: 32896,
      thistle: 14204888,
      tomato: 16737095,
      turquoise: 4251856,
      violet: 15631086,
      wheat: 16113331,
      white: 16777215,
      whitesmoke: 16119285,
      yellow: 16776960,
      yellowgreen: 10145074
    },
    Ha = {
      h: 0,
      s: 0,
      l: 0
    },
    Vf = {
      h: 0,
      s: 0,
      l: 0
    };
  Object.assign(D.prototype, {
    isColor: !0,
    r: 1,
    g: 1,
    b: 1,
    set: function(a) {
      a && a.isColor ? this.copy(a) : "number" === typeof a ? this.setHex(a) : "string" === typeof a && this.setStyle(a);
      return this
    },
    setScalar: function(a) {
      this.b = this.g = this.r = a;
      return this
    },
    setHex: function(a) {
      a = Math.floor(a);
      this.r = (a >> 16 & 255) / 255;
      this.g = (a >> 8 & 255) / 255;
      this.b = (a & 255) / 255;
      return this
    },
    setRGB: function(a, b, c) {
      this.r = a;
      this.g = b;
      this.b = c;
      return this
    },
    setHSL: function(a, b, c) {
      a = N.euclideanModulo(a, 1);
      b = N.clamp(b,
        0, 1);
      c = N.clamp(c, 0, 1);
      0 === b ? this.r = this.g = this.b = c : (b = .5 >= c ? c * (1 + b) : c + b - c * b, c = 2 * c - b, this.r = tg(c, b, a + 1 / 3), this.g = tg(c, b, a), this.b = tg(c, b, a - 1 / 3));
      return this
    },
    setStyle: function(a) {
      function b(b) {
        void 0 !== b && 1 > parseFloat(b) && console.warn("THREE.Color: Alpha component of " + a + " will be ignored.")
      }
      var c;
      if (c = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(a)) {
        var d = c[2];
        switch (c[1]) {
          case "rgb":
          case "rgba":
            if (c = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)) return this.r = Math.min(255, parseInt(c[1],
              10)) / 255, this.g = Math.min(255, parseInt(c[2], 10)) / 255, this.b = Math.min(255, parseInt(c[3], 10)) / 255, b(c[5]), this;
            if (c = /^(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)) return this.r = Math.min(100, parseInt(c[1], 10)) / 100, this.g = Math.min(100, parseInt(c[2], 10)) / 100, this.b = Math.min(100, parseInt(c[3], 10)) / 100, b(c[5]), this;
            break;
          case "hsl":
          case "hsla":
            if (c = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)) {
              d = parseFloat(c[1]) / 360;
              var f = parseInt(c[2],
                  10) / 100,
                g = parseInt(c[3], 10) / 100;
              b(c[5]);
              return this.setHSL(d, f, g)
            }
        }
      } else if (c = /^#([A-Fa-f0-9]+)$/.exec(a)) {
        c = c[1];
        d = c.length;
        if (3 === d) return this.r = parseInt(c.charAt(0) + c.charAt(0), 16) / 255, this.g = parseInt(c.charAt(1) + c.charAt(1), 16) / 255, this.b = parseInt(c.charAt(2) + c.charAt(2), 16) / 255, this;
        if (6 === d) return this.r = parseInt(c.charAt(0) + c.charAt(1), 16) / 255, this.g = parseInt(c.charAt(2) + c.charAt(3), 16) / 255, this.b = parseInt(c.charAt(4) + c.charAt(5), 16) / 255, this
      }
      return a && 0 < a.length ? this.setColorName(a) : this
    },
    setColorName: function(a) {
      var b = oj[a];
      void 0 !== b ? this.setHex(b) : console.warn("THREE.Color: Unknown color " + a);
      return this
    },
    clone: function() {
      return new this.constructor(this.r, this.g, this.b)
    },
    copy: function(a) {
      this.r = a.r;
      this.g = a.g;
      this.b = a.b;
      return this
    },
    copyGammaToLinear: function(a, b) {
      void 0 === b && (b = 2);
      this.r = Math.pow(a.r, b);
      this.g = Math.pow(a.g, b);
      this.b = Math.pow(a.b, b);
      return this
    },
    copyLinearToGamma: function(a, b) {
      void 0 === b && (b = 2);
      b = 0 < b ? 1 / b : 1;
      this.r = Math.pow(a.r, b);
      this.g = Math.pow(a.g, b);
      this.b = Math.pow(a.b,
        b);
      return this
    },
    convertGammaToLinear: function(a) {
      this.copyGammaToLinear(this, a);
      return this
    },
    convertLinearToGamma: function(a) {
      this.copyLinearToGamma(this, a);
      return this
    },
    copySRGBToLinear: function(a) {
      this.r = ug(a.r);
      this.g = ug(a.g);
      this.b = ug(a.b);
      return this
    },
    copyLinearToSRGB: function(a) {
      this.r = vg(a.r);
      this.g = vg(a.g);
      this.b = vg(a.b);
      return this
    },
    convertSRGBToLinear: function() {
      this.copySRGBToLinear(this);
      return this
    },
    convertLinearToSRGB: function() {
      this.copyLinearToSRGB(this);
      return this
    },
    getHex: function() {
      return 255 *
        this.r << 16 ^ 255 * this.g << 8 ^ 255 * this.b << 0
    },
    getHexString: function() {
      return ("000000" + this.getHex().toString(16)).slice(-6)
    },
    getHSL: function(a) {
      void 0 === a && (console.warn("THREE.Color: .getHSL() target is now required"), a = {
        h: 0,
        s: 0,
        l: 0
      });
      var b = this.r,
        c = this.g,
        d = this.b,
        f = Math.max(b, c, d),
        g = Math.min(b, c, d),
        k, m = (g + f) / 2;
      if (g === f) g = k = 0;
      else {
        var n = f - g;
        g = .5 >= m ? n / (f + g) : n / (2 - f - g);
        switch (f) {
          case b:
            k = (c - d) / n + (c < d ? 6 : 0);
            break;
          case c:
            k = (d - b) / n + 2;
            break;
          case d:
            k = (b - c) / n + 4
        }
        k /= 6
      }
      a.h = k;
      a.s = g;
      a.l = m;
      return a
    },
    getStyle: function() {
      return "rgb(" +
        (255 * this.r | 0) + "," + (255 * this.g | 0) + "," + (255 * this.b | 0) + ")"
    },
    offsetHSL: function(a, b, c) {
      this.getHSL(Ha);
      Ha.h += a;
      Ha.s += b;
      Ha.l += c;
      this.setHSL(Ha.h, Ha.s, Ha.l);
      return this
    },
    add: function(a) {
      this.r += a.r;
      this.g += a.g;
      this.b += a.b;
      return this
    },
    addColors: function(a, b) {
      this.r = a.r + b.r;
      this.g = a.g + b.g;
      this.b = a.b + b.b;
      return this
    },
    addScalar: function(a) {
      this.r += a;
      this.g += a;
      this.b += a;
      return this
    },
    sub: function(a) {
      this.r = Math.max(0, this.r - a.r);
      this.g = Math.max(0, this.g - a.g);
      this.b = Math.max(0, this.b - a.b);
      return this
    },
    multiply: function(a) {
      this.r *=
        a.r;
      this.g *= a.g;
      this.b *= a.b;
      return this
    },
    multiplyScalar: function(a) {
      this.r *= a;
      this.g *= a;
      this.b *= a;
      return this
    },
    lerp: function(a, b) {
      this.r += (a.r - this.r) * b;
      this.g += (a.g - this.g) * b;
      this.b += (a.b - this.b) * b;
      return this
    },
    lerpHSL: function(a, b) {
      this.getHSL(Ha);
      a.getHSL(Vf);
      a = N.lerp(Ha.h, Vf.h, b);
      var c = N.lerp(Ha.s, Vf.s, b);
      b = N.lerp(Ha.l, Vf.l, b);
      this.setHSL(a, c, b);
      return this
    },
    equals: function(a) {
      return a.r === this.r && a.g === this.g && a.b === this.b
    },
    fromArray: function(a, b) {
      void 0 === b && (b = 0);
      this.r = a[b];
      this.g = a[b + 1];
      this.b = a[b + 2];
      return this
    },
    toArray: function(a, b) {
      void 0 === a && (a = []);
      void 0 === b && (b = 0);
      a[b] = this.r;
      a[b + 1] = this.g;
      a[b + 2] = this.b;
      return a
    },
    toJSON: function() {
      return this.getHex()
    }
  });
  D.NAMES = oj;
  Object.assign(Mc.prototype, {
    clone: function() {
      return (new this.constructor).copy(this)
    },
    copy: function(a) {
      this.a = a.a;
      this.b = a.b;
      this.c = a.c;
      this.normal.copy(a.normal);
      this.color.copy(a.color);
      this.materialIndex = a.materialIndex;
      for (var b = 0, c = a.vertexNormals.length; b < c; b++) this.vertexNormals[b] = a.vertexNormals[b].clone();
      b = 0;
      for (c = a.vertexColors.length; b < c; b++) this.vertexColors[b] = a.vertexColors[b].clone();
      return this
    }
  });
  var Qj = 0;
  R.prototype = Object.assign(Object.create(Ra.prototype), {
    constructor: R,
    isMaterial: !0,
    onBeforeCompile: function() {},
    setValues: function(a) {
      if (void 0 !== a)
        for (var b in a) {
          var c = a[b];
          if (void 0 === c) console.warn("THREE.Material: '" + b + "' parameter is undefined.");
          else if ("shading" === b) console.warn("THREE." + this.type + ": .shading has been removed. Use the boolean .flatShading instead."), this.flatShading =
            1 === c ? !0 : !1;
          else {
            var d = this[b];
            void 0 === d ? console.warn("THREE." + this.type + ": '" + b + "' is not a property of this material.") : d && d.isColor ? d.set(c) : d && d.isVector3 && c && c.isVector3 ? d.copy(c) : this[b] = c
          }
        }
    },
    toJSON: function(a) {
      function b(a) {
        var b = [],
          c;
        for (c in a) {
          var d = a[c];
          delete d.metadata;
          b.push(d)
        }
        return b
      }
      var c = void 0 === a || "string" === typeof a;
      c && (a = {
        textures: {},
        images: {}
      });
      var d = {
        metadata: {
          version: 4.5,
          type: "Material",
          generator: "Material.toJSON"
        }
      };
      d.uuid = this.uuid;
      d.type = this.type;
      "" !== this.name && (d.name =
        this.name);
      this.color && this.color.isColor && (d.color = this.color.getHex());
      void 0 !== this.roughness && (d.roughness = this.roughness);
      void 0 !== this.metalness && (d.metalness = this.metalness);
      this.sheen && this.sheen.isColor && (d.sheen = this.sheen.getHex());
      this.emissive && this.emissive.isColor && (d.emissive = this.emissive.getHex());
      this.emissiveIntensity && 1 !== this.emissiveIntensity && (d.emissiveIntensity = this.emissiveIntensity);
      this.specular && this.specular.isColor && (d.specular = this.specular.getHex());
      void 0 !== this.shininess &&
        (d.shininess = this.shininess);
      void 0 !== this.clearcoat && (d.clearcoat = this.clearcoat);
      void 0 !== this.clearcoatRoughness && (d.clearcoatRoughness = this.clearcoatRoughness);
      this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture && (d.clearcoatNormalMap = this.clearcoatNormalMap.toJSON(a).uuid, d.clearcoatNormalScale = this.clearcoatNormalScale.toArray());
      this.map && this.map.isTexture && (d.map = this.map.toJSON(a).uuid);
      this.matcap && this.matcap.isTexture && (d.matcap = this.matcap.toJSON(a).uuid);
      this.alphaMap && this.alphaMap.isTexture &&
        (d.alphaMap = this.alphaMap.toJSON(a).uuid);
      this.lightMap && this.lightMap.isTexture && (d.lightMap = this.lightMap.toJSON(a).uuid);
      this.aoMap && this.aoMap.isTexture && (d.aoMap = this.aoMap.toJSON(a).uuid, d.aoMapIntensity = this.aoMapIntensity);
      this.bumpMap && this.bumpMap.isTexture && (d.bumpMap = this.bumpMap.toJSON(a).uuid, d.bumpScale = this.bumpScale);
      this.normalMap && this.normalMap.isTexture && (d.normalMap = this.normalMap.toJSON(a).uuid, d.normalMapType = this.normalMapType, d.normalScale = this.normalScale.toArray());
      this.displacementMap &&
        this.displacementMap.isTexture && (d.displacementMap = this.displacementMap.toJSON(a).uuid, d.displacementScale = this.displacementScale, d.displacementBias = this.displacementBias);
      this.roughnessMap && this.roughnessMap.isTexture && (d.roughnessMap = this.roughnessMap.toJSON(a).uuid);
      this.metalnessMap && this.metalnessMap.isTexture && (d.metalnessMap = this.metalnessMap.toJSON(a).uuid);
      this.emissiveMap && this.emissiveMap.isTexture && (d.emissiveMap = this.emissiveMap.toJSON(a).uuid);
      this.specularMap && this.specularMap.isTexture &&
        (d.specularMap = this.specularMap.toJSON(a).uuid);
      this.envMap && this.envMap.isTexture && (d.envMap = this.envMap.toJSON(a).uuid, d.reflectivity = this.reflectivity, d.refractionRatio = this.refractionRatio, void 0 !== this.combine && (d.combine = this.combine), void 0 !== this.envMapIntensity && (d.envMapIntensity = this.envMapIntensity));
      this.gradientMap && this.gradientMap.isTexture && (d.gradientMap = this.gradientMap.toJSON(a).uuid);
      void 0 !== this.size && (d.size = this.size);
      void 0 !== this.sizeAttenuation && (d.sizeAttenuation = this.sizeAttenuation);
      1 !== this.blending && (d.blending = this.blending);
      !0 === this.flatShading && (d.flatShading = this.flatShading);
      0 !== this.side && (d.side = this.side);
      0 !== this.vertexColors && (d.vertexColors = this.vertexColors);
      1 > this.opacity && (d.opacity = this.opacity);
      !0 === this.transparent && (d.transparent = this.transparent);
      d.depthFunc = this.depthFunc;
      d.depthTest = this.depthTest;
      d.depthWrite = this.depthWrite;
      d.stencilWrite = this.stencilWrite;
      d.stencilWriteMask = this.stencilWriteMask;
      d.stencilFunc = this.stencilFunc;
      d.stencilRef = this.stencilRef;
      d.stencilFuncMask = this.stencilFuncMask;
      d.stencilFail = this.stencilFail;
      d.stencilZFail = this.stencilZFail;
      d.stencilZPass = this.stencilZPass;
      this.rotation && 0 !== this.rotation && (d.rotation = this.rotation);
      !0 === this.polygonOffset && (d.polygonOffset = !0);
      0 !== this.polygonOffsetFactor && (d.polygonOffsetFactor = this.polygonOffsetFactor);
      0 !== this.polygonOffsetUnits && (d.polygonOffsetUnits = this.polygonOffsetUnits);
      this.linewidth && 1 !== this.linewidth && (d.linewidth = this.linewidth);
      void 0 !== this.dashSize && (d.dashSize = this.dashSize);
      void 0 !== this.gapSize && (d.gapSize = this.gapSize);
      void 0 !== this.scale && (d.scale = this.scale);
      !0 === this.dithering && (d.dithering = !0);
      0 < this.alphaTest && (d.alphaTest = this.alphaTest);
      !0 === this.premultipliedAlpha && (d.premultipliedAlpha = this.premultipliedAlpha);
      !0 === this.wireframe && (d.wireframe = this.wireframe);
      1 < this.wireframeLinewidth && (d.wireframeLinewidth = this.wireframeLinewidth);
      "round" !== this.wireframeLinecap && (d.wireframeLinecap = this.wireframeLinecap);
      "round" !== this.wireframeLinejoin && (d.wireframeLinejoin =
        this.wireframeLinejoin);
      !0 === this.morphTargets && (d.morphTargets = !0);
      !0 === this.morphNormals && (d.morphNormals = !0);
      !0 === this.skinning && (d.skinning = !0);
      !1 === this.visible && (d.visible = !1);
      !1 === this.toneMapped && (d.toneMapped = !1);
      "{}" !== JSON.stringify(this.userData) && (d.userData = this.userData);
      c && (c = b(a.textures), a = b(a.images), 0 < c.length && (d.textures = c), 0 < a.length && (d.images = a));
      return d
    },
    clone: function() {
      return (new this.constructor).copy(this)
    },
    copy: function(a) {
      this.name = a.name;
      this.fog = a.fog;
      this.blending =
        a.blending;
      this.side = a.side;
      this.flatShading = a.flatShading;
      this.vertexTangents = a.vertexTangents;
      this.vertexColors = a.vertexColors;
      this.opacity = a.opacity;
      this.transparent = a.transparent;
      this.blendSrc = a.blendSrc;
      this.blendDst = a.blendDst;
      this.blendEquation = a.blendEquation;
      this.blendSrcAlpha = a.blendSrcAlpha;
      this.blendDstAlpha = a.blendDstAlpha;
      this.blendEquationAlpha = a.blendEquationAlpha;
      this.depthFunc = a.depthFunc;
      this.depthTest = a.depthTest;
      this.depthWrite = a.depthWrite;
      this.stencilWriteMask = a.stencilWriteMask;
      this.stencilFunc = a.stencilFunc;
      this.stencilRef = a.stencilRef;
      this.stencilFuncMask = a.stencilFuncMask;
      this.stencilFail = a.stencilFail;
      this.stencilZFail = a.stencilZFail;
      this.stencilZPass = a.stencilZPass;
      this.stencilWrite = a.stencilWrite;
      var b = a.clippingPlanes,
        c = null;
      if (null !== b) {
        var d = b.length;
        c = Array(d);
        for (var f = 0; f !== d; ++f) c[f] = b[f].clone()
      }
      this.clippingPlanes = c;
      this.clipIntersection = a.clipIntersection;
      this.clipShadows = a.clipShadows;
      this.shadowSide = a.shadowSide;
      this.colorWrite = a.colorWrite;
      this.precision =
        a.precision;
      this.polygonOffset = a.polygonOffset;
      this.polygonOffsetFactor = a.polygonOffsetFactor;
      this.polygonOffsetUnits = a.polygonOffsetUnits;
      this.dithering = a.dithering;
      this.alphaTest = a.alphaTest;
      this.premultipliedAlpha = a.premultipliedAlpha;
      this.visible = a.visible;
      this.toneMapped = a.toneMapped;
      this.userData = JSON.parse(JSON.stringify(a.userData));
      return this
    },
    dispose: function() {
      this.dispatchEvent({
        type: "dispose"
      })
    }
  });
  Ia.prototype = Object.create(R.prototype);
  Ia.prototype.constructor = Ia;
  Ia.prototype.isMeshBasicMaterial = !0;
  Ia.prototype.copy = function(a) {
    R.prototype.copy.call(this, a);
    this.color.copy(a.color);
    this.map = a.map;
    this.lightMap = a.lightMap;
    this.lightMapIntensity = a.lightMapIntensity;
    this.aoMap = a.aoMap;
    this.aoMapIntensity = a.aoMapIntensity;
    this.specularMap = a.specularMap;
    this.alphaMap = a.alphaMap;
    this.envMap = a.envMap;
    this.combine = a.combine;
    this.reflectivity = a.reflectivity;
    this.refractionRatio = a.refractionRatio;
    this.wireframe = a.wireframe;
    this.wireframeLinewidth = a.wireframeLinewidth;
    this.wireframeLinecap = a.wireframeLinecap;
    this.wireframeLinejoin = a.wireframeLinejoin;
    this.skinning = a.skinning;
    this.morphTargets = a.morphTargets;
    return this
  };
  Object.defineProperty(O.prototype, "needsUpdate", {
    set: function(a) {
      !0 === a && this.version++
    }
  });
  Object.assign(O.prototype, {
    isBufferAttribute: !0,
    onUploadCallback: function() {},
    setUsage: function(a) {
      this.usage = a;
      return this
    },
    copy: function(a) {
      this.name = a.name;
      this.array = new a.array.constructor(a.array);
      this.itemSize = a.itemSize;
      this.count = a.count;
      this.normalized = a.normalized;
      this.usage = a.usage;
      return this
    },
    copyAt: function(a, b, c) {
      a *= this.itemSize;
      c *= b.itemSize;
      for (var d = 0, f = this.itemSize; d < f; d++) this.array[a + d] = b.array[c + d];
      return this
    },
    copyArray: function(a) {
      this.array.set(a);
      return this
    },
    copyColorsArray: function(a) {
      for (var b = this.array, c = 0, d = 0, f = a.length; d < f; d++) {
        var g = a[d];
        void 0 === g && (console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined", d), g = new D);
        b[c++] = g.r;
        b[c++] = g.g;
        b[c++] = g.b
      }
      return this
    },
    copyVector2sArray: function(a) {
      for (var b = this.array, c = 0, d = 0, f = a.length; d < f; d++) {
        var g =
          a[d];
        void 0 === g && (console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined", d), g = new z);
        b[c++] = g.x;
        b[c++] = g.y
      }
      return this
    },
    copyVector3sArray: function(a) {
      for (var b = this.array, c = 0, d = 0, f = a.length; d < f; d++) {
        var g = a[d];
        void 0 === g && (console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined", d), g = new q);
        b[c++] = g.x;
        b[c++] = g.y;
        b[c++] = g.z
      }
      return this
    },
    copyVector4sArray: function(a) {
      for (var b = this.array, c = 0, d = 0, f = a.length; d < f; d++) {
        var g = a[d];
        void 0 === g && (console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",
          d), g = new ca);
        b[c++] = g.x;
        b[c++] = g.y;
        b[c++] = g.z;
        b[c++] = g.w
      }
      return this
    },
    set: function(a, b) {
      void 0 === b && (b = 0);
      this.array.set(a, b);
      return this
    },
    getX: function(a) {
      return this.array[a * this.itemSize]
    },
    setX: function(a, b) {
      this.array[a * this.itemSize] = b;
      return this
    },
    getY: function(a) {
      return this.array[a * this.itemSize + 1]
    },
    setY: function(a, b) {
      this.array[a * this.itemSize + 1] = b;
      return this
    },
    getZ: function(a) {
      return this.array[a * this.itemSize + 2]
    },
    setZ: function(a, b) {
      this.array[a * this.itemSize + 2] = b;
      return this
    },
    getW: function(a) {
      return this.array[a *
        this.itemSize + 3]
    },
    setW: function(a, b) {
      this.array[a * this.itemSize + 3] = b;
      return this
    },
    setXY: function(a, b, c) {
      a *= this.itemSize;
      this.array[a + 0] = b;
      this.array[a + 1] = c;
      return this
    },
    setXYZ: function(a, b, c, d) {
      a *= this.itemSize;
      this.array[a + 0] = b;
      this.array[a + 1] = c;
      this.array[a + 2] = d;
      return this
    },
    setXYZW: function(a, b, c, d, f) {
      a *= this.itemSize;
      this.array[a + 0] = b;
      this.array[a + 1] = c;
      this.array[a + 2] = d;
      this.array[a + 3] = f;
      return this
    },
    onUpload: function(a) {
      this.onUploadCallback = a;
      return this
    },
    clone: function() {
      return (new this.constructor(this.array,
        this.itemSize)).copy(this)
    },
    toJSON: function() {
      return {
        itemSize: this.itemSize,
        type: this.array.constructor.name,
        array: Array.prototype.slice.call(this.array),
        normalized: this.normalized
      }
    }
  });
  Ld.prototype = Object.create(O.prototype);
  Ld.prototype.constructor = Ld;
  Md.prototype = Object.create(O.prototype);
  Md.prototype.constructor = Md;
  Nd.prototype = Object.create(O.prototype);
  Nd.prototype.constructor = Nd;
  Od.prototype = Object.create(O.prototype);
  Od.prototype.constructor = Od;
  bc.prototype = Object.create(O.prototype);
  bc.prototype.constructor =
    bc;
  Pd.prototype = Object.create(O.prototype);
  Pd.prototype.constructor = Pd;
  cc.prototype = Object.create(O.prototype);
  cc.prototype.constructor = cc;
  F.prototype = Object.create(O.prototype);
  F.prototype.constructor = F;
  Qd.prototype = Object.create(O.prototype);
  Qd.prototype.constructor = Qd;
  Object.assign(Vh.prototype, {
    computeGroups: function(a) {
      var b = [],
        c = void 0;
      a = a.faces;
      for (var d = 0; d < a.length; d++) {
        var f = a[d];
        if (f.materialIndex !== c) {
          c = f.materialIndex;
          void 0 !== g && (g.count = 3 * d - g.start, b.push(g));
          var g = {
            start: 3 * d,
            materialIndex: c
          }
        }
      }
      void 0 !==
        g && (g.count = 3 * d - g.start, b.push(g));
      this.groups = b
    },
    fromGeometry: function(a) {
      var b = a.faces,
        c = a.vertices,
        d = a.faceVertexUvs,
        f = d[0] && 0 < d[0].length,
        g = d[1] && 0 < d[1].length,
        k = a.morphTargets,
        m = k.length;
      if (0 < m) {
        var n = [];
        for (var l = 0; l < m; l++) n[l] = {
          name: k[l].name,
          data: []
        };
        this.morphTargets.position = n
      }
      var q = a.morphNormals,
        t = q.length;
      if (0 < t) {
        var r = [];
        for (l = 0; l < t; l++) r[l] = {
          name: q[l].name,
          data: []
        };
        this.morphTargets.normal = r
      }
      var u = a.skinIndices,
        v = a.skinWeights,
        w = u.length === c.length,
        x = v.length === c.length;
      0 < c.length &&
        0 === b.length && console.error("THREE.DirectGeometry: Faceless geometries are not supported.");
      for (l = 0; l < b.length; l++) {
        var B = b[l];
        this.vertices.push(c[B.a], c[B.b], c[B.c]);
        var C = B.vertexNormals;
        3 === C.length ? this.normals.push(C[0], C[1], C[2]) : (C = B.normal, this.normals.push(C, C, C));
        C = B.vertexColors;
        3 === C.length ? this.colors.push(C[0], C[1], C[2]) : (C = B.color, this.colors.push(C, C, C));
        !0 === f && (C = d[0][l], void 0 !== C ? this.uvs.push(C[0], C[1], C[2]) : (console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ",
          l), this.uvs.push(new z, new z, new z)));
        !0 === g && (C = d[1][l], void 0 !== C ? this.uvs2.push(C[0], C[1], C[2]) : (console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ", l), this.uvs2.push(new z, new z, new z)));
        for (C = 0; C < m; C++) {
          var A = k[C].vertices;
          n[C].data.push(A[B.a], A[B.b], A[B.c])
        }
        for (C = 0; C < t; C++) A = q[C].vertexNormals[l], r[C].data.push(A.a, A.b, A.c);
        w && this.skinIndices.push(u[B.a], u[B.b], u[B.c]);
        x && this.skinWeights.push(v[B.a], v[B.b], v[B.c])
      }
      this.computeGroups(a);
      this.verticesNeedUpdate = a.verticesNeedUpdate;
      this.normalsNeedUpdate = a.normalsNeedUpdate;
      this.colorsNeedUpdate = a.colorsNeedUpdate;
      this.uvsNeedUpdate = a.uvsNeedUpdate;
      this.groupsNeedUpdate = a.groupsNeedUpdate;
      null !== a.boundingSphere && (this.boundingSphere = a.boundingSphere.clone());
      null !== a.boundingBox && (this.boundingBox = a.boundingBox.clone());
      return this
    }
  });
  var Rj = 1,
    pb = new I,
    Ah = new E,
    Wf = new q,
    Dc = new gb,
    Bh = new gb,
    db = new q;
  G.prototype = Object.assign(Object.create(Ra.prototype), {
    constructor: G,
    isBufferGeometry: !0,
    getIndex: function() {
      return this.index
    },
    setIndex: function(a) {
      Array.isArray(a) ? this.index = new(65535 < Wh(a) ? cc : bc)(a, 1) : this.index = a
    },
    getAttribute: function(a) {
      return this.attributes[a]
    },
    setAttribute: function(a, b) {
      this.attributes[a] = b;
      return this
    },
    deleteAttribute: function(a) {
      delete this.attributes[a];
      return this
    },
    addGroup: function(a, b, c) {
      this.groups.push({
        start: a,
        count: b,
        materialIndex: void 0 !== c ? c : 0
      })
    },
    clearGroups: function() {
      this.groups = []
    },
    setDrawRange: function(a, b) {
      this.drawRange.start = a;
      this.drawRange.count = b
    },
    applyMatrix: function(a) {
      var b =
        this.attributes.position;
      void 0 !== b && (a.applyToBufferAttribute(b), b.needsUpdate = !0);
      var c = this.attributes.normal;
      void 0 !== c && (b = (new ka).getNormalMatrix(a), b.applyToBufferAttribute(c), c.needsUpdate = !0);
      c = this.attributes.tangent;
      void 0 !== c && (b = (new ka).getNormalMatrix(a), b.applyToBufferAttribute(c), c.needsUpdate = !0);
      null !== this.boundingBox && this.computeBoundingBox();
      null !== this.boundingSphere && this.computeBoundingSphere();
      return this
    },
    rotateX: function(a) {
      pb.makeRotationX(a);
      this.applyMatrix(pb);
      return this
    },
    rotateY: function(a) {
      pb.makeRotationY(a);
      this.applyMatrix(pb);
      return this
    },
    rotateZ: function(a) {
      pb.makeRotationZ(a);
      this.applyMatrix(pb);
      return this
    },
    translate: function(a, b, c) {
      pb.makeTranslation(a, b, c);
      this.applyMatrix(pb);
      return this
    },
    scale: function(a, b, c) {
      pb.makeScale(a, b, c);
      this.applyMatrix(pb);
      return this
    },
    lookAt: function(a) {
      Ah.lookAt(a);
      Ah.updateMatrix();
      this.applyMatrix(Ah.matrix);
      return this
    },
    center: function() {
      this.computeBoundingBox();
      this.boundingBox.getCenter(Wf).negate();
      this.translate(Wf.x,
        Wf.y, Wf.z);
      return this
    },
    setFromObject: function(a) {
      var b = a.geometry;
      if (a.isPoints || a.isLine) {
        a = new F(3 * b.vertices.length, 3);
        var c = new F(3 * b.colors.length, 3);
        this.setAttribute("position", a.copyVector3sArray(b.vertices));
        this.setAttribute("color", c.copyColorsArray(b.colors));
        b.lineDistances && b.lineDistances.length === b.vertices.length && (a = new F(b.lineDistances.length, 1), this.setAttribute("lineDistance", a.copyArray(b.lineDistances)));
        null !== b.boundingSphere && (this.boundingSphere = b.boundingSphere.clone());
        null !== b.boundingBox && (this.boundingBox = b.boundingBox.clone())
      } else a.isMesh && b && b.isGeometry && this.fromGeometry(b);
      return this
    },
    setFromPoints: function(a) {
      for (var b = [], c = 0, d = a.length; c < d; c++) {
        var f = a[c];
        b.push(f.x, f.y, f.z || 0)
      }
      this.setAttribute("position", new F(b, 3));
      return this
    },
    updateFromObject: function(a) {
      var b = a.geometry;
      if (a.isMesh) {
        var c = b.__directGeometry;
        !0 === b.elementsNeedUpdate && (c = void 0, b.elementsNeedUpdate = !1);
        if (void 0 === c) return this.fromGeometry(b);
        c.verticesNeedUpdate = b.verticesNeedUpdate;
        c.normalsNeedUpdate = b.normalsNeedUpdate;
        c.colorsNeedUpdate = b.colorsNeedUpdate;
        c.uvsNeedUpdate = b.uvsNeedUpdate;
        c.groupsNeedUpdate = b.groupsNeedUpdate;
        b.verticesNeedUpdate = !1;
        b.normalsNeedUpdate = !1;
        b.colorsNeedUpdate = !1;
        b.uvsNeedUpdate = !1;
        b.groupsNeedUpdate = !1;
        b = c
      }!0 === b.verticesNeedUpdate && (c = this.attributes.position, void 0 !== c && (c.copyVector3sArray(b.vertices), c.needsUpdate = !0), b.verticesNeedUpdate = !1);
      !0 === b.normalsNeedUpdate && (c = this.attributes.normal, void 0 !== c && (c.copyVector3sArray(b.normals),
        c.needsUpdate = !0), b.normalsNeedUpdate = !1);
      !0 === b.colorsNeedUpdate && (c = this.attributes.color, void 0 !== c && (c.copyColorsArray(b.colors), c.needsUpdate = !0), b.colorsNeedUpdate = !1);
      b.uvsNeedUpdate && (c = this.attributes.uv, void 0 !== c && (c.copyVector2sArray(b.uvs), c.needsUpdate = !0), b.uvsNeedUpdate = !1);
      b.lineDistancesNeedUpdate && (c = this.attributes.lineDistance, void 0 !== c && (c.copyArray(b.lineDistances), c.needsUpdate = !0), b.lineDistancesNeedUpdate = !1);
      b.groupsNeedUpdate && (b.computeGroups(a.geometry), this.groups =
        b.groups, b.groupsNeedUpdate = !1);
      return this
    },
    fromGeometry: function(a) {
      a.__directGeometry = (new Vh).fromGeometry(a);
      return this.fromDirectGeometry(a.__directGeometry)
    },
    fromDirectGeometry: function(a) {
      var b = new Float32Array(3 * a.vertices.length);
      this.setAttribute("position", (new O(b, 3)).copyVector3sArray(a.vertices));
      0 < a.normals.length && (b = new Float32Array(3 * a.normals.length), this.setAttribute("normal", (new O(b, 3)).copyVector3sArray(a.normals)));
      0 < a.colors.length && (b = new Float32Array(3 * a.colors.length),
        this.setAttribute("color", (new O(b, 3)).copyColorsArray(a.colors)));
      0 < a.uvs.length && (b = new Float32Array(2 * a.uvs.length), this.setAttribute("uv", (new O(b, 2)).copyVector2sArray(a.uvs)));
      0 < a.uvs2.length && (b = new Float32Array(2 * a.uvs2.length), this.setAttribute("uv2", (new O(b, 2)).copyVector2sArray(a.uvs2)));
      this.groups = a.groups;
      for (var c in a.morphTargets) {
        b = [];
        for (var d = a.morphTargets[c], f = 0, g = d.length; f < g; f++) {
          var k = d[f],
            m = new F(3 * k.data.length, 3);
          m.name = k.name;
          b.push(m.copyVector3sArray(k.data))
        }
        this.morphAttributes[c] =
          b
      }
      0 < a.skinIndices.length && (c = new F(4 * a.skinIndices.length, 4), this.setAttribute("skinIndex", c.copyVector4sArray(a.skinIndices)));
      0 < a.skinWeights.length && (c = new F(4 * a.skinWeights.length, 4), this.setAttribute("skinWeight", c.copyVector4sArray(a.skinWeights)));
      null !== a.boundingSphere && (this.boundingSphere = a.boundingSphere.clone());
      null !== a.boundingBox && (this.boundingBox = a.boundingBox.clone());
      return this
    },
    computeBoundingBox: function() {
      null === this.boundingBox && (this.boundingBox = new gb);
      var a = this.attributes.position,
        b = this.morphAttributes.position;
      if (void 0 !== a) {
        if (this.boundingBox.setFromBufferAttribute(a), b) {
          a = 0;
          for (var c = b.length; a < c; a++) Dc.setFromBufferAttribute(b[a]), this.boundingBox.expandByPoint(Dc.min), this.boundingBox.expandByPoint(Dc.max)
        }
      } else this.boundingBox.makeEmpty();
      (isNaN(this.boundingBox.min.x) || isNaN(this.boundingBox.min.y) || isNaN(this.boundingBox.min.z)) && console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',
        this)
    },
    computeBoundingSphere: function() {
      null === this.boundingSphere && (this.boundingSphere = new ub);
      var a = this.attributes.position,
        b = this.morphAttributes.position;
      if (a) {
        var c = this.boundingSphere.center;
        Dc.setFromBufferAttribute(a);
        if (b)
          for (var d = 0, f = b.length; d < f; d++) {
            var g = b[d];
            Bh.setFromBufferAttribute(g);
            Dc.expandByPoint(Bh.min);
            Dc.expandByPoint(Bh.max)
          }
        Dc.getCenter(c);
        var k = 0;
        d = 0;
        for (f = a.count; d < f; d++) db.fromBufferAttribute(a, d), k = Math.max(k, c.distanceToSquared(db));
        if (b)
          for (d = 0, f = b.length; d < f; d++) {
            g =
              b[d];
            a = 0;
            for (var m = g.count; a < m; a++) db.fromBufferAttribute(g, a), k = Math.max(k, c.distanceToSquared(db))
          }
        this.boundingSphere.radius = Math.sqrt(k);
        isNaN(this.boundingSphere.radius) && console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this)
      }
    },
    computeFaceNormals: function() {},
    computeVertexNormals: function() {
      var a = this.index,
        b = this.attributes;
      if (b.position) {
        var c = b.position.array;
        if (void 0 === b.normal) this.setAttribute("normal",
          new O(new Float32Array(c.length), 3));
        else
          for (var d = b.normal.array, f = 0, g = d.length; f < g; f++) d[f] = 0;
        d = b.normal.array;
        var k = new q,
          m = new q,
          n = new q,
          l = new q,
          y = new q;
        if (a) {
          var t = a.array;
          f = 0;
          for (g = a.count; f < g; f += 3) {
            a = 3 * t[f + 0];
            var r = 3 * t[f + 1];
            var u = 3 * t[f + 2];
            k.fromArray(c, a);
            m.fromArray(c, r);
            n.fromArray(c, u);
            l.subVectors(n, m);
            y.subVectors(k, m);
            l.cross(y);
            d[a] += l.x;
            d[a + 1] += l.y;
            d[a + 2] += l.z;
            d[r] += l.x;
            d[r + 1] += l.y;
            d[r + 2] += l.z;
            d[u] += l.x;
            d[u + 1] += l.y;
            d[u + 2] += l.z
          }
        } else
          for (f = 0, g = c.length; f < g; f += 9) k.fromArray(c, f), m.fromArray(c,
            f + 3), n.fromArray(c, f + 6), l.subVectors(n, m), y.subVectors(k, m), l.cross(y), d[f] = l.x, d[f + 1] = l.y, d[f + 2] = l.z, d[f + 3] = l.x, d[f + 4] = l.y, d[f + 5] = l.z, d[f + 6] = l.x, d[f + 7] = l.y, d[f + 8] = l.z;
        this.normalizeNormals();
        b.normal.needsUpdate = !0
      }
    },
    merge: function(a, b) {
      if (a && a.isBufferGeometry) {
        void 0 === b && (b = 0, console.warn("THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge."));
        var c = this.attributes,
          d;
        for (d in c)
          if (void 0 !== a.attributes[d]) {
            var f =
              c[d].array,
              g = a.attributes[d],
              k = g.array,
              m = g.itemSize * b;
            g = Math.min(k.length, f.length - m);
            for (var n = 0; n < g; n++, m++) f[m] = k[n]
          }
        return this
      }
      console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.", a)
    },
    normalizeNormals: function() {
      for (var a = this.attributes.normal, b = 0, c = a.count; b < c; b++) db.x = a.getX(b), db.y = a.getY(b), db.z = a.getZ(b), db.normalize(), a.setXYZ(b, db.x, db.y, db.z)
    },
    toNonIndexed: function() {
      function a(a, b) {
        var c = a.array;
        a = a.itemSize;
        for (var d = new c.constructor(b.length *
            a), f, g = 0, k = 0, m = b.length; k < m; k++) {
          f = b[k] * a;
          for (var n = 0; n < a; n++) d[g++] = c[f++]
        }
        return new O(d, a)
      }
      if (null === this.index) return console.warn("THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed."), this;
      var b = new G,
        c = this.index.array,
        d = this.attributes,
        f;
      for (f in d) {
        var g = d[f];
        g = a(g, c);
        b.setAttribute(f, g)
      }
      var k = this.morphAttributes;
      for (f in k) {
        var m = [],
          n = k[f];
        d = 0;
        for (var l = n.length; d < l; d++) g = n[d], g = a(g, c), m.push(g);
        b.morphAttributes[f] = m
      }
      c = this.groups;
      d = 0;
      for (f = c.length; d < f; d++) g = c[d], b.addGroup(g.start,
        g.count, g.materialIndex);
      return b
    },
    toJSON: function() {
      var a = {
        metadata: {
          version: 4.5,
          type: "BufferGeometry",
          generator: "BufferGeometry.toJSON"
        }
      };
      a.uuid = this.uuid;
      a.type = this.type;
      "" !== this.name && (a.name = this.name);
      0 < Object.keys(this.userData).length && (a.userData = this.userData);
      if (void 0 !== this.parameters) {
        var b = this.parameters;
        for (l in b) void 0 !== b[l] && (a[l] = b[l]);
        return a
      }
      a.data = {
        attributes: {}
      };
      b = this.index;
      null !== b && (a.data.index = {
        type: b.array.constructor.name,
        array: Array.prototype.slice.call(b.array)
      });
      var c = this.attributes;
      for (l in c) {
        b = c[l];
        var d = b.toJSON();
        "" !== b.name && (d.name = b.name);
        a.data.attributes[l] = d
      }
      c = {};
      var f = !1;
      for (l in this.morphAttributes) {
        for (var g = this.morphAttributes[l], k = [], m = 0, n = g.length; m < n; m++) b = g[m], d = b.toJSON(), "" !== b.name && (d.name = b.name), k.push(d);
        0 < k.length && (c[l] = k, f = !0)
      }
      f && (a.data.morphAttributes = c);
      var l = this.groups;
      0 < l.length && (a.data.groups = JSON.parse(JSON.stringify(l)));
      l = this.boundingSphere;
      null !== l && (a.data.boundingSphere = {
        center: l.center.toArray(),
        radius: l.radius
      });
      return a
    },
    clone: function() {
      return (new G).copy(this)
    },
    copy: function(a) {
      var b;
      this.index = null;
      this.attributes = {};
      this.morphAttributes = {};
      this.groups = [];
      this.boundingSphere = this.boundingBox = null;
      this.name = a.name;
      var c = a.index;
      null !== c && this.setIndex(c.clone());
      c = a.attributes;
      for (k in c) this.setAttribute(k, c[k].clone());
      var d = a.morphAttributes;
      for (k in d) {
        var f = [],
          g = d[k];
        c = 0;
        for (b = g.length; c < b; c++) f.push(g[c].clone());
        this.morphAttributes[k] = f
      }
      var k = a.groups;
      c = 0;
      for (b = k.length; c < b; c++) d = k[c], this.addGroup(d.start,
        d.count, d.materialIndex);
      k = a.boundingBox;
      null !== k && (this.boundingBox = k.clone());
      k = a.boundingSphere;
      null !== k && (this.boundingSphere = k.clone());
      this.drawRange.start = a.drawRange.start;
      this.drawRange.count = a.drawRange.count;
      this.userData = a.userData;
      return this
    },
    dispose: function() {
      this.dispatchEvent({
        type: "dispose"
      })
    }
  });
  var pj = new I,
    Ec = new ac,
    Ch = new ub,
    dc = new q,
    ec = new q,
    fc = new q,
    Yh = new q,
    Zh = new q,
    $h = new q,
    wg = new q,
    xg = new q,
    yg = new q,
    Nc = new z,
    Oc = new z,
    Pc = new z,
    Rd = new q,
    Xe = new q;
  ia.prototype = Object.assign(Object.create(E.prototype), {
    constructor: ia,
    isMesh: !0,
    setDrawMode: function(a) {
      this.drawMode = a
    },
    copy: function(a) {
      E.prototype.copy.call(this, a);
      this.drawMode = a.drawMode;
      void 0 !== a.morphTargetInfluences && (this.morphTargetInfluences = a.morphTargetInfluences.slice());
      void 0 !== a.morphTargetDictionary && (this.morphTargetDictionary = Object.assign({}, a.morphTargetDictionary));
      return this
    },
    updateMorphTargets: function() {
      var a = this.geometry;
      if (a.isBufferGeometry) {
        a = a.morphAttributes;
        var b = Object.keys(a);
        if (0 < b.length) {
          var c = a[b[0]];
          if (void 0 !==
            c)
            for (this.morphTargetInfluences = [], this.morphTargetDictionary = {}, a = 0, b = c.length; a < b; a++) {
              var d = c[a].name || String(a);
              this.morphTargetInfluences.push(0);
              this.morphTargetDictionary[d] = a
            }
        }
      } else a = a.morphTargets, void 0 !== a && 0 < a.length && console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")
    },
    raycast: function(a, b) {
      var c = this.geometry,
        d = this.material,
        f = this.matrixWorld;
      if (void 0 !== d && (null === c.boundingSphere && c.computeBoundingSphere(), Ch.copy(c.boundingSphere),
          Ch.applyMatrix4(f), !1 !== a.ray.intersectsSphere(Ch) && (pj.getInverse(f), Ec.copy(a.ray).applyMatrix4(pj), null === c.boundingBox || !1 !== Ec.intersectsBox(c.boundingBox))))
        if (0 !== this.drawMode) console.warn("THREE.Mesh: TriangleStripDrawMode and TriangleFanDrawMode are not supported by .raycast().");
        else if (c.isBufferGeometry) {
        var g = c.index;
        f = c.attributes.position;
        var k = c.morphAttributes.position,
          m = c.attributes.uv,
          n = c.attributes.uv2,
          l = c.groups,
          q = c.drawRange,
          t, r;
        if (null !== g)
          if (Array.isArray(d)) {
            var u = 0;
            for (t =
              l.length; u < t; u++) {
              var v = l[u];
              var w = d[v.materialIndex];
              var x = Math.max(v.start, q.start);
              for (r = c = Math.min(v.start + v.count, q.start + q.count); x < r; x += 3) {
                c = g.getX(x);
                var B = g.getX(x + 1);
                var C = g.getX(x + 2);
                if (c = Ye(this, w, a, Ec, f, k, m, n, c, B, C)) c.faceIndex = Math.floor(x / 3), c.face.materialIndex = v.materialIndex, b.push(c)
              }
            }
          } else
            for (x = Math.max(0, q.start), c = Math.min(g.count, q.start + q.count), u = x, t = c; u < t; u += 3) {
              if (c = g.getX(u), B = g.getX(u + 1), C = g.getX(u + 2), c = Ye(this, d, a, Ec, f, k, m, n, c, B, C)) c.faceIndex = Math.floor(u / 3), b.push(c)
            } else if (void 0 !==
              f)
              if (Array.isArray(d))
                for (u = 0, t = l.length; u < t; u++)
                  for (v = l[u], w = d[v.materialIndex], x = Math.max(v.start, q.start), r = c = Math.min(v.start + v.count, q.start + q.count); x < r; x += 3) {
                    if (c = x, B = x + 1, C = x + 2, c = Ye(this, w, a, Ec, f, k, m, n, c, B, C)) c.faceIndex = Math.floor(x / 3), c.face.materialIndex = v.materialIndex, b.push(c)
                  } else
                    for (x = Math.max(0, q.start), c = Math.min(f.count, q.start + q.count), u = x, t = c; u < t; u += 3)
                      if (c = u, B = u + 1, C = u + 2, c = Ye(this, d, a, Ec, f, k, m, n, c, B, C)) c.faceIndex = Math.floor(u / 3), b.push(c)
      } else if (c.isGeometry)
        for (f = Array.isArray(d),
          k = c.vertices, m = c.faces, c = c.faceVertexUvs[0], 0 < c.length && (g = c), u = 0, t = m.length; u < t; u++)
          if (v = m[u], c = f ? d[v.materialIndex] : d, void 0 !== c && (n = k[v.a], l = k[v.b], q = k[v.c], c = Xh(this, c, a, Ec, n, l, q, Rd))) g && g[u] && (w = g[u], Nc.copy(w[0]), Oc.copy(w[1]), Pc.copy(w[2]), c.uv = va.getUV(Rd, n, l, q, Nc, Oc, Pc, new z)), c.face = v, c.faceIndex = u, b.push(c)
    },
    clone: function() {
      return (new this.constructor(this.geometry, this.material)).copy(this)
    }
  });
  var Sj = 0,
    qb = new I,
    Dh = new E,
    Xf = new q;
  P.prototype = Object.assign(Object.create(Ra.prototype), {
    constructor: P,
    isGeometry: !0,
    applyMatrix: function(a) {
      for (var b = (new ka).getNormalMatrix(a), c = 0, d = this.vertices.length; c < d; c++) this.vertices[c].applyMatrix4(a);
      c = 0;
      for (d = this.faces.length; c < d; c++) {
        a = this.faces[c];
        a.normal.applyMatrix3(b).normalize();
        for (var f = 0, g = a.vertexNormals.length; f < g; f++) a.vertexNormals[f].applyMatrix3(b).normalize()
      }
      null !== this.boundingBox && this.computeBoundingBox();
      null !== this.boundingSphere && this.computeBoundingSphere();
      this.normalsNeedUpdate = this.verticesNeedUpdate = !0;
      return this
    },
    rotateX: function(a) {
      qb.makeRotationX(a);
      this.applyMatrix(qb);
      return this
    },
    rotateY: function(a) {
      qb.makeRotationY(a);
      this.applyMatrix(qb);
      return this
    },
    rotateZ: function(a) {
      qb.makeRotationZ(a);
      this.applyMatrix(qb);
      return this
    },
    translate: function(a, b, c) {
      qb.makeTranslation(a, b, c);
      this.applyMatrix(qb);
      return this
    },
    scale: function(a, b, c) {
      qb.makeScale(a, b, c);
      this.applyMatrix(qb);
      return this
    },
    lookAt: function(a) {
      Dh.lookAt(a);
      Dh.updateMatrix();
      this.applyMatrix(Dh.matrix);
      return this
    },
    fromBufferGeometry: function(a) {
      function b(a, b, d, f) {
        var g = void 0 ===
          m ? [] : [c.colors[a].clone(), c.colors[b].clone(), c.colors[d].clone()],
          p = void 0 === k ? [] : [(new q).fromArray(k, 3 * a), (new q).fromArray(k, 3 * b), (new q).fromArray(k, 3 * d)];
        f = new Mc(a, b, d, p, g, f);
        c.faces.push(f);
        void 0 !== n && c.faceVertexUvs[0].push([(new z).fromArray(n, 2 * a), (new z).fromArray(n, 2 * b), (new z).fromArray(n, 2 * d)]);
        void 0 !== l && c.faceVertexUvs[1].push([(new z).fromArray(l, 2 * a), (new z).fromArray(l, 2 * b), (new z).fromArray(l, 2 * d)])
      }
      var c = this,
        d = null !== a.index ? a.index.array : void 0,
        f = a.attributes;
      if (void 0 ===
        f.position) return console.error("THREE.Geometry.fromBufferGeometry(): Position attribute required for conversion."), this;
      var g = f.position.array,
        k = void 0 !== f.normal ? f.normal.array : void 0,
        m = void 0 !== f.color ? f.color.array : void 0,
        n = void 0 !== f.uv ? f.uv.array : void 0,
        l = void 0 !== f.uv2 ? f.uv2.array : void 0;
      void 0 !== l && (this.faceVertexUvs[1] = []);
      for (f = 0; f < g.length; f += 3) c.vertices.push((new q).fromArray(g, f)), void 0 !== m && c.colors.push((new D).fromArray(m, f));
      var y = a.groups;
      if (0 < y.length)
        for (f = 0; f < y.length; f++) {
          g =
            y[f];
          var t = g.start,
            r = t;
          for (t += g.count; r < t; r += 3) void 0 !== d ? b(d[r], d[r + 1], d[r + 2], g.materialIndex) : b(r, r + 1, r + 2, g.materialIndex)
        } else if (void 0 !== d)
          for (f = 0; f < d.length; f += 3) b(d[f], d[f + 1], d[f + 2]);
        else
          for (f = 0; f < g.length / 3; f += 3) b(f, f + 1, f + 2);
      this.computeFaceNormals();
      null !== a.boundingBox && (this.boundingBox = a.boundingBox.clone());
      null !== a.boundingSphere && (this.boundingSphere = a.boundingSphere.clone());
      return this
    },
    center: function() {
      this.computeBoundingBox();
      this.boundingBox.getCenter(Xf).negate();
      this.translate(Xf.x,
        Xf.y, Xf.z);
      return this
    },
    normalize: function() {
      this.computeBoundingSphere();
      var a = this.boundingSphere.center,
        b = this.boundingSphere.radius;
      b = 0 === b ? 1 : 1 / b;
      var c = new I;
      c.set(b, 0, 0, -b * a.x, 0, b, 0, -b * a.y, 0, 0, b, -b * a.z, 0, 0, 0, 1);
      this.applyMatrix(c);
      return this
    },
    computeFaceNormals: function() {
      for (var a = new q, b = new q, c = 0, d = this.faces.length; c < d; c++) {
        var f = this.faces[c],
          g = this.vertices[f.a],
          k = this.vertices[f.b];
        a.subVectors(this.vertices[f.c], k);
        b.subVectors(g, k);
        a.cross(b);
        a.normalize();
        f.normal.copy(a)
      }
    },
    computeVertexNormals: function(a) {
      void 0 ===
        a && (a = !0);
      var b;
      var c = Array(this.vertices.length);
      var d = 0;
      for (b = this.vertices.length; d < b; d++) c[d] = new q;
      if (a) {
        var f = new q,
          g = new q;
        a = 0;
        for (d = this.faces.length; a < d; a++) {
          b = this.faces[a];
          var k = this.vertices[b.a];
          var m = this.vertices[b.b];
          var l = this.vertices[b.c];
          f.subVectors(l, m);
          g.subVectors(k, m);
          f.cross(g);
          c[b.a].add(f);
          c[b.b].add(f);
          c[b.c].add(f)
        }
      } else
        for (this.computeFaceNormals(), a = 0, d = this.faces.length; a < d; a++) b = this.faces[a], c[b.a].add(b.normal), c[b.b].add(b.normal), c[b.c].add(b.normal);
      d = 0;
      for (b =
        this.vertices.length; d < b; d++) c[d].normalize();
      a = 0;
      for (d = this.faces.length; a < d; a++) b = this.faces[a], k = b.vertexNormals, 3 === k.length ? (k[0].copy(c[b.a]), k[1].copy(c[b.b]), k[2].copy(c[b.c])) : (k[0] = c[b.a].clone(), k[1] = c[b.b].clone(), k[2] = c[b.c].clone());
      0 < this.faces.length && (this.normalsNeedUpdate = !0)
    },
    computeFlatVertexNormals: function() {
      var a;
      this.computeFaceNormals();
      var b = 0;
      for (a = this.faces.length; b < a; b++) {
        var c = this.faces[b];
        var d = c.vertexNormals;
        3 === d.length ? (d[0].copy(c.normal), d[1].copy(c.normal),
          d[2].copy(c.normal)) : (d[0] = c.normal.clone(), d[1] = c.normal.clone(), d[2] = c.normal.clone())
      }
      0 < this.faces.length && (this.normalsNeedUpdate = !0)
    },
    computeMorphNormals: function() {
      var a, b;
      var c = 0;
      for (b = this.faces.length; c < b; c++) {
        var d = this.faces[c];
        d.__originalFaceNormal ? d.__originalFaceNormal.copy(d.normal) : d.__originalFaceNormal = d.normal.clone();
        d.__originalVertexNormals || (d.__originalVertexNormals = []);
        var f = 0;
        for (a = d.vertexNormals.length; f < a; f++) d.__originalVertexNormals[f] ? d.__originalVertexNormals[f].copy(d.vertexNormals[f]) :
          d.__originalVertexNormals[f] = d.vertexNormals[f].clone()
      }
      var g = new P;
      g.faces = this.faces;
      f = 0;
      for (a = this.morphTargets.length; f < a; f++) {
        if (!this.morphNormals[f]) {
          this.morphNormals[f] = {};
          this.morphNormals[f].faceNormals = [];
          this.morphNormals[f].vertexNormals = [];
          d = this.morphNormals[f].faceNormals;
          var k = this.morphNormals[f].vertexNormals;
          c = 0;
          for (b = this.faces.length; c < b; c++) {
            var m = new q;
            var l = {
              a: new q,
              b: new q,
              c: new q
            };
            d.push(m);
            k.push(l)
          }
        }
        k = this.morphNormals[f];
        g.vertices = this.morphTargets[f].vertices;
        g.computeFaceNormals();
        g.computeVertexNormals();
        c = 0;
        for (b = this.faces.length; c < b; c++) d = this.faces[c], m = k.faceNormals[c], l = k.vertexNormals[c], m.copy(d.normal), l.a.copy(d.vertexNormals[0]), l.b.copy(d.vertexNormals[1]), l.c.copy(d.vertexNormals[2])
      }
      c = 0;
      for (b = this.faces.length; c < b; c++) d = this.faces[c], d.normal = d.__originalFaceNormal, d.vertexNormals = d.__originalVertexNormals
    },
    computeBoundingBox: function() {
      null === this.boundingBox && (this.boundingBox = new gb);
      this.boundingBox.setFromPoints(this.vertices)
    },
    computeBoundingSphere: function() {
      null ===
        this.boundingSphere && (this.boundingSphere = new ub);
      this.boundingSphere.setFromPoints(this.vertices)
    },
    merge: function(a, b, c) {
      if (a && a.isGeometry) {
        var d, f = this.vertices.length,
          g = this.vertices,
          k = a.vertices,
          m = this.faces,
          l = a.faces,
          p = this.colors,
          q = a.colors;
        void 0 === c && (c = 0);
        void 0 !== b && (d = (new ka).getNormalMatrix(b));
        for (var t = 0, r = k.length; t < r; t++) {
          var u = k[t].clone();
          void 0 !== b && u.applyMatrix4(b);
          g.push(u)
        }
        t = 0;
        for (r = q.length; t < r; t++) p.push(q[t].clone());
        t = 0;
        for (r = l.length; t < r; t++) {
          k = l[t];
          var v = k.vertexNormals;
          q = k.vertexColors;
          p = new Mc(k.a + f, k.b + f, k.c + f);
          p.normal.copy(k.normal);
          void 0 !== d && p.normal.applyMatrix3(d).normalize();
          b = 0;
          for (g = v.length; b < g; b++) u = v[b].clone(), void 0 !== d && u.applyMatrix3(d).normalize(), p.vertexNormals.push(u);
          p.color.copy(k.color);
          b = 0;
          for (g = q.length; b < g; b++) u = q[b], p.vertexColors.push(u.clone());
          p.materialIndex = k.materialIndex + c;
          m.push(p)
        }
        t = 0;
        for (r = a.faceVertexUvs.length; t < r; t++)
          for (c = a.faceVertexUvs[t], void 0 === this.faceVertexUvs[t] && (this.faceVertexUvs[t] = []), b = 0, g = c.length; b < g; b++) {
            d =
              c[b];
            f = [];
            m = 0;
            for (l = d.length; m < l; m++) f.push(d[m].clone());
            this.faceVertexUvs[t].push(f)
          }
      } else console.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.", a)
    },
    mergeMesh: function(a) {
      a && a.isMesh ? (a.matrixAutoUpdate && a.updateMatrix(), this.merge(a.geometry, a.matrix)) : console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.", a)
    },
    mergeVertices: function() {
      var a = {},
        b = [],
        c = [],
        d = Math.pow(10, 4),
        f;
      var g = 0;
      for (f = this.vertices.length; g < f; g++) {
        var k = this.vertices[g];
        k = Math.round(k.x * d) + "_" + Math.round(k.y * d) + "_" + Math.round(k.z * d);
        void 0 === a[k] ? (a[k] = g, b.push(this.vertices[g]), c[g] = b.length - 1) : c[g] = c[a[k]]
      }
      a = [];
      g = 0;
      for (f = this.faces.length; g < f; g++)
        for (d = this.faces[g], d.a = c[d.a], d.b = c[d.b], d.c = c[d.c], d = [d.a, d.b, d.c], k = 0; 3 > k; k++)
          if (d[k] === d[(k + 1) % 3]) {
            a.push(g);
            break
          }
      for (g = a.length - 1; 0 <= g; g--)
        for (d = a[g], this.faces.splice(d, 1), c = 0, f = this.faceVertexUvs.length; c < f; c++) this.faceVertexUvs[c].splice(d, 1);
      g = this.vertices.length - b.length;
      this.vertices = b;
      return g
    },
    setFromPoints: function(a) {
      this.vertices = [];
      for (var b = 0, c = a.length; b < c; b++) {
        var d = a[b];
        this.vertices.push(new q(d.x, d.y, d.z || 0))
      }
      return this
    },
    sortFacesByMaterialIndex: function() {
      for (var a = this.faces, b = a.length, c = 0; c < b; c++) a[c]._id = c;
      a.sort(function(a, b) {
        return a.materialIndex - b.materialIndex
      });
      var d = this.faceVertexUvs[0],
        f = this.faceVertexUvs[1],
        g, k;
      d && d.length === b && (g = []);
      f && f.length === b && (k = []);
      for (c = 0; c < b; c++) {
        var m = a[c]._id;
        g && g.push(d[m]);
        k && k.push(f[m])
      }
      g && (this.faceVertexUvs[0] = g);
      k && (this.faceVertexUvs[1] = k)
    },
    toJSON: function() {
      function a(a,
        b, c) {
        return c ? a | 1 << b : a & ~(1 << b)
      }

      function b(a) {
        var b = a.x.toString() + a.y.toString() + a.z.toString();
        if (void 0 !== p[b]) return p[b];
        p[b] = l.length / 3;
        l.push(a.x, a.y, a.z);
        return p[b]
      }

      function c(a) {
        var b = a.r.toString() + a.g.toString() + a.b.toString();
        if (void 0 !== t[b]) return t[b];
        t[b] = q.length;
        q.push(a.getHex());
        return t[b]
      }

      function d(a) {
        var b = a.x.toString() + a.y.toString();
        if (void 0 !== u[b]) return u[b];
        u[b] = r.length / 2;
        r.push(a.x, a.y);
        return u[b]
      }
      var f = {
        metadata: {
          version: 4.5,
          type: "Geometry",
          generator: "Geometry.toJSON"
        }
      };
      f.uuid = this.uuid;
      f.type = this.type;
      "" !== this.name && (f.name = this.name);
      if (void 0 !== this.parameters) {
        var g = this.parameters,
          k;
        for (k in g) void 0 !== g[k] && (f[k] = g[k]);
        return f
      }
      g = [];
      for (k = 0; k < this.vertices.length; k++) {
        var m = this.vertices[k];
        g.push(m.x, m.y, m.z)
      }
      m = [];
      var l = [],
        p = {},
        q = [],
        t = {},
        r = [],
        u = {};
      for (k = 0; k < this.faces.length; k++) {
        var v = this.faces[k],
          w = void 0 !== this.faceVertexUvs[0][k],
          x = 0 < v.normal.length(),
          B = 0 < v.vertexNormals.length,
          C = 1 !== v.color.r || 1 !== v.color.g || 1 !== v.color.b,
          A = 0 < v.vertexColors.length,
          z = 0;
        z = a(z, 0, 0);
        z = a(z, 1, !0);
        z = a(z, 2, !1);
        z = a(z, 3, w);
        z = a(z, 4, x);
        z = a(z, 5, B);
        z = a(z, 6, C);
        z = a(z, 7, A);
        m.push(z);
        m.push(v.a, v.b, v.c);
        m.push(v.materialIndex);
        w && (w = this.faceVertexUvs[0][k], m.push(d(w[0]), d(w[1]), d(w[2])));
        x && m.push(b(v.normal));
        B && (x = v.vertexNormals, m.push(b(x[0]), b(x[1]), b(x[2])));
        C && m.push(c(v.color));
        A && (v = v.vertexColors, m.push(c(v[0]), c(v[1]), c(v[2])))
      }
      f.data = {};
      f.data.vertices = g;
      f.data.normals = l;
      0 < q.length && (f.data.colors = q);
      0 < r.length && (f.data.uvs = [r]);
      f.data.faces = m;
      return f
    },
    clone: function() {
      return (new P).copy(this)
    },
    copy: function(a) {
      var b, c, d;
      this.vertices = [];
      this.colors = [];
      this.faces = [];
      this.faceVertexUvs = [
        []
      ];
      this.morphTargets = [];
      this.morphNormals = [];
      this.skinWeights = [];
      this.skinIndices = [];
      this.lineDistances = [];
      this.boundingSphere = this.boundingBox = null;
      this.name = a.name;
      var f = a.vertices;
      var g = 0;
      for (b = f.length; g < b; g++) this.vertices.push(f[g].clone());
      f = a.colors;
      g = 0;
      for (b = f.length; g < b; g++) this.colors.push(f[g].clone());
      f = a.faces;
      g = 0;
      for (b = f.length; g < b; g++) this.faces.push(f[g].clone());
      g = 0;
      for (b = a.faceVertexUvs.length; g <
        b; g++) {
        var k = a.faceVertexUvs[g];
        void 0 === this.faceVertexUvs[g] && (this.faceVertexUvs[g] = []);
        f = 0;
        for (c = k.length; f < c; f++) {
          var m = k[f],
            l = [];
          var p = 0;
          for (d = m.length; p < d; p++) l.push(m[p].clone());
          this.faceVertexUvs[g].push(l)
        }
      }
      p = a.morphTargets;
      g = 0;
      for (b = p.length; g < b; g++) {
        d = {};
        d.name = p[g].name;
        if (void 0 !== p[g].vertices)
          for (d.vertices = [], f = 0, c = p[g].vertices.length; f < c; f++) d.vertices.push(p[g].vertices[f].clone());
        if (void 0 !== p[g].normals)
          for (d.normals = [], f = 0, c = p[g].normals.length; f < c; f++) d.normals.push(p[g].normals[f].clone());
        this.morphTargets.push(d)
      }
      p = a.morphNormals;
      g = 0;
      for (b = p.length; g < b; g++) {
        d = {};
        if (void 0 !== p[g].vertexNormals)
          for (d.vertexNormals = [], f = 0, c = p[g].vertexNormals.length; f < c; f++) k = p[g].vertexNormals[f], m = {}, m.a = k.a.clone(), m.b = k.b.clone(), m.c = k.c.clone(), d.vertexNormals.push(m);
        if (void 0 !== p[g].faceNormals)
          for (d.faceNormals = [], f = 0, c = p[g].faceNormals.length; f < c; f++) d.faceNormals.push(p[g].faceNormals[f].clone());
        this.morphNormals.push(d)
      }
      f = a.skinWeights;
      g = 0;
      for (b = f.length; g < b; g++) this.skinWeights.push(f[g].clone());
      f = a.skinIndices;
      g = 0;
      for (b = f.length; g < b; g++) this.skinIndices.push(f[g].clone());
      f = a.lineDistances;
      g = 0;
      for (b = f.length; g < b; g++) this.lineDistances.push(f[g]);
      g = a.boundingBox;
      null !== g && (this.boundingBox = g.clone());
      g = a.boundingSphere;
      null !== g && (this.boundingSphere = g.clone());
      this.elementsNeedUpdate = a.elementsNeedUpdate;
      this.verticesNeedUpdate = a.verticesNeedUpdate;
      this.uvsNeedUpdate = a.uvsNeedUpdate;
      this.normalsNeedUpdate = a.normalsNeedUpdate;
      this.colorsNeedUpdate = a.colorsNeedUpdate;
      this.lineDistancesNeedUpdate =
        a.lineDistancesNeedUpdate;
      this.groupsNeedUpdate = a.groupsNeedUpdate;
      return this
    },
    dispose: function() {
      this.dispatchEvent({
        type: "dispose"
      })
    }
  });
  var Eh = function(a) {
      function b(b, d, f, g, k, m) {
        a.call(this);
        this.type = "BoxGeometry";
        this.parameters = {
          width: b,
          height: d,
          depth: f,
          widthSegments: g,
          heightSegments: k,
          depthSegments: m
        };
        this.fromBufferGeometry(new Ud(b, d, f, g, k, m));
        this.mergeVertices()
      }
      a && (b.__proto__ = a);
      b.prototype = Object.create(a && a.prototype);
      return b.prototype.constructor = b
    }(P),
    Ud = function(a) {
      function b(b,
        d, f, g, k, m) {
        function c(a, b, c, d, f, g, k, m, n, p, z) {
          var x = g / n,
            B = k / p,
            A = g / 2,
            C = k / 2,
            D = m / 2;
          k = n + 1;
          var E = p + 1,
            F = g = 0,
            G, H, I = new q;
          for (H = 0; H < E; H++) {
            var K = H * B - C;
            for (G = 0; G < k; G++) I[a] = (G * x - A) * d, I[b] = K * f, I[c] = D, t.push(I.x, I.y, I.z), I[a] = 0, I[b] = 0, I[c] = 0 < m ? 1 : -1, r.push(I.x, I.y, I.z), u.push(G / n), u.push(1 - H / p), g += 1
          }
          for (H = 0; H < p; H++)
            for (G = 0; G < n; G++) a = v + G + k * (H + 1), b = v + (G + 1) + k * (H + 1), c = v + (G + 1) + k * H, y.push(v + G + k * H, a, c), y.push(a, b, c), F += 6;
          l.addGroup(w, F, z);
          w += F;
          v += g
        }
        a.call(this);
        this.type = "BoxBufferGeometry";
        this.parameters = {
          width: b,
          height: d,
          depth: f,
          widthSegments: g,
          heightSegments: k,
          depthSegments: m
        };
        var l = this;
        b = b || 1;
        d = d || 1;
        f = f || 1;
        g = Math.floor(g) || 1;
        k = Math.floor(k) || 1;
        m = Math.floor(m) || 1;
        var y = [],
          t = [],
          r = [],
          u = [],
          v = 0,
          w = 0;
        c("z", "y", "x", -1, -1, f, d, b, m, k, 0);
        c("z", "y", "x", 1, -1, f, d, -b, m, k, 1);
        c("x", "z", "y", 1, 1, b, f, d, g, m, 2);
        c("x", "z", "y", 1, -1, b, f, -d, g, m, 3);
        c("x", "y", "z", 1, -1, b, d, f, g, k, 4);
        c("x", "y", "z", -1, -1, b, d, -f, g, k, 5);
        this.setIndex(y);
        this.setAttribute("position", new F(t, 3));
        this.setAttribute("normal", new F(r, 3));
        this.setAttribute("uv",
          new F(u, 2))
      }
      a && (b.__proto__ = a);
      b.prototype = Object.create(a && a.prototype);
      return b.prototype.constructor = b
    }(G),
    Kl = {
      clone: gc,
      merge: za
    };
  Aa.prototype = Object.create(R.prototype);
  Aa.prototype.constructor = Aa;
  Aa.prototype.isShaderMaterial = !0;
  Aa.prototype.copy = function(a) {
    R.prototype.copy.call(this, a);
    this.fragmentShader = a.fragmentShader;
    this.vertexShader = a.vertexShader;
    this.uniforms = gc(a.uniforms);
    this.defines = Object.assign({}, a.defines);
    this.wireframe = a.wireframe;
    this.wireframeLinewidth = a.wireframeLinewidth;
    this.lights = a.lights;
    this.clipping = a.clipping;
    this.skinning = a.skinning;
    this.morphTargets = a.morphTargets;
    this.morphNormals = a.morphNormals;
    this.extensions = a.extensions;
    return this
  };
  Aa.prototype.toJSON = function(a) {
    var b = R.prototype.toJSON.call(this, a);
    b.uniforms = {};
    for (var c in this.uniforms) {
      var d = this.uniforms[c].value;
      b.uniforms[c] = d && d.isTexture ? {
          type: "t",
          value: d.toJSON(a).uuid
        } : d && d.isColor ? {
          type: "c",
          value: d.getHex()
        } : d && d.isVector2 ? {
          type: "v2",
          value: d.toArray()
        } : d && d.isVector3 ? {
          type: "v3",
          value: d.toArray()
        } :
        d && d.isVector4 ? {
          type: "v4",
          value: d.toArray()
        } : d && d.isMatrix3 ? {
          type: "m3",
          value: d.toArray()
        } : d && d.isMatrix4 ? {
          type: "m4",
          value: d.toArray()
        } : {
          value: d
        }
    }
    0 < Object.keys(this.defines).length && (b.defines = this.defines);
    b.vertexShader = this.vertexShader;
    b.fragmentShader = this.fragmentShader;
    a = {};
    for (var f in this.extensions) !0 === this.extensions[f] && (a[f] = !0);
    0 < Object.keys(a).length && (b.extensions = a);
    return b
  };
  hb.prototype = Object.assign(Object.create(E.prototype), {
    constructor: hb,
    isCamera: !0,
    copy: function(a, b) {
      E.prototype.copy.call(this,
        a, b);
      this.matrixWorldInverse.copy(a.matrixWorldInverse);
      this.projectionMatrix.copy(a.projectionMatrix);
      this.projectionMatrixInverse.copy(a.projectionMatrixInverse);
      return this
    },
    getWorldDirection: function(a) {
      void 0 === a && (console.warn("THREE.Camera: .getWorldDirection() target is now required"), a = new q);
      this.updateMatrixWorld(!0);
      var b = this.matrixWorld.elements;
      return a.set(-b[8], -b[9], -b[10]).normalize()
    },
    updateMatrixWorld: function(a) {
      E.prototype.updateMatrixWorld.call(this, a);
      this.matrixWorldInverse.getInverse(this.matrixWorld)
    },
    clone: function() {
      return (new this.constructor).copy(this)
    }
  });
  na.prototype = Object.assign(Object.create(hb.prototype), {
    constructor: na,
    isPerspectiveCamera: !0,
    copy: function(a, b) {
      hb.prototype.copy.call(this, a, b);
      this.fov = a.fov;
      this.zoom = a.zoom;
      this.near = a.near;
      this.far = a.far;
      this.focus = a.focus;
      this.aspect = a.aspect;
      this.view = null === a.view ? null : Object.assign({}, a.view);
      this.filmGauge = a.filmGauge;
      this.filmOffset = a.filmOffset;
      return this
    },
    setFocalLength: function(a) {
      a = .5 * this.getFilmHeight() / a;
      this.fov = 2 * N.RAD2DEG *
        Math.atan(a);
      this.updateProjectionMatrix()
    },
    getFocalLength: function() {
      var a = Math.tan(.5 * N.DEG2RAD * this.fov);
      return .5 * this.getFilmHeight() / a
    },
    getEffectiveFOV: function() {
      return 2 * N.RAD2DEG * Math.atan(Math.tan(.5 * N.DEG2RAD * this.fov) / this.zoom)
    },
    getFilmWidth: function() {
      return this.filmGauge * Math.min(this.aspect, 1)
    },
    getFilmHeight: function() {
      return this.filmGauge / Math.max(this.aspect, 1)
    },
    setViewOffset: function(a, b, c, d, f, g) {
      this.aspect = a / b;
      null === this.view && (this.view = {
        enabled: !0,
        fullWidth: 1,
        fullHeight: 1,
        offsetX: 0,
        offsetY: 0,
        width: 1,
        height: 1
      });
      this.view.enabled = !0;
      this.view.fullWidth = a;
      this.view.fullHeight = b;
      this.view.offsetX = c;
      this.view.offsetY = d;
      this.view.width = f;
      this.view.height = g;
      this.updateProjectionMatrix()
    },
    clearViewOffset: function() {
      null !== this.view && (this.view.enabled = !1);
      this.updateProjectionMatrix()
    },
    updateProjectionMatrix: function() {
      var a = this.near,
        b = a * Math.tan(.5 * N.DEG2RAD * this.fov) / this.zoom,
        c = 2 * b,
        d = this.aspect * c,
        f = -.5 * d,
        g = this.view;
      if (null !== this.view && this.view.enabled) {
        var k = g.fullWidth,
          m = g.fullHeight;
        f += g.offsetX * d / k;
        b -= g.offsetY * c / m;
        d *= g.width / k;
        c *= g.height / m
      }
      g = this.filmOffset;
      0 !== g && (f += a * g / this.getFilmWidth());
      this.projectionMatrix.makePerspective(f, f + d, b, b - c, a, this.far);
      this.projectionMatrixInverse.getInverse(this.projectionMatrix)
    },
    toJSON: function(a) {
      a = E.prototype.toJSON.call(this, a);
      a.object.fov = this.fov;
      a.object.zoom = this.zoom;
      a.object.near = this.near;
      a.object.far = this.far;
      a.object.focus = this.focus;
      a.object.aspect = this.aspect;
      null !== this.view && (a.object.view = Object.assign({},
        this.view));
      a.object.filmGauge = this.filmGauge;
      a.object.filmOffset = this.filmOffset;
      return a
    }
  });
  Qc.prototype = Object.create(E.prototype);
  Qc.prototype.constructor = Qc;
  Ib.prototype = Object.create(sa.prototype);
  Ib.prototype.constructor = Ib;
  Ib.prototype.isWebGLRenderTargetCube = !0;
  Ib.prototype.fromEquirectangularTexture = function(a, b) {
    this.texture.type = b.type;
    this.texture.format = b.format;
    this.texture.encoding = b.encoding;
    var c = new Kd,
      d = new Aa({
        type: "CubemapFromEquirect",
        uniforms: gc({
          tEquirect: {
            value: null
          }
        }),
        vertexShader: "varying vec3 vWorldDirection;\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}",
        fragmentShader: "uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}",
        side: 1,
        blending: 0
      });
    d.uniforms.tEquirect.value = b;
    b = new ia(new Ud(5,
      5, 5), d);
    c.add(b);
    d = new Qc(1, 10, 1);
    d.renderTarget = this;
    d.renderTarget.texture.name = "CubeCameraTexture";
    d.update(a, c);
    b.geometry.dispose();
    b.material.dispose();
    return this
  };
  hc.prototype = Object.create(S.prototype);
  hc.prototype.constructor = hc;
  hc.prototype.isDataTexture = !0;
  var Hd = new ub,
    Yf = new q;
  Object.assign(Sd.prototype, {
    set: function(a, b, c, d, f, g) {
      var k = this.planes;
      k[0].copy(a);
      k[1].copy(b);
      k[2].copy(c);
      k[3].copy(d);
      k[4].copy(f);
      k[5].copy(g);
      return this
    },
    clone: function() {
      return (new this.constructor).copy(this)
    },
    copy: function(a) {
      for (var b = this.planes, c = 0; 6 > c; c++) b[c].copy(a.planes[c]);
      return this
    },
    setFromMatrix: function(a) {
      var b = this.planes,
        c = a.elements;
      a = c[0];
      var d = c[1],
        f = c[2],
        g = c[3],
        k = c[4],
        m = c[5],
        l = c[6],
        p = c[7],
        q = c[8],
        t = c[9],
        r = c[10],
        u = c[11],
        v = c[12],
        w = c[13],
        x = c[14];
      c = c[15];
      b[0].setComponents(g - a, p - k, u - q, c - v).normalize();
      b[1].setComponents(g + a, p + k, u + q, c + v).normalize();
      b[2].setComponents(g + d, p + m, u + t, c + w).normalize();
      b[3].setComponents(g - d, p - m, u - t, c - w).normalize();
      b[4].setComponents(g - f, p - l, u - r, c - x).normalize();
      b[5].setComponents(g + f, p + l, u + r, c + x).normalize();
      return this
    },
    intersectsObject: function(a) {
      var b = a.geometry;
      null === b.boundingSphere && b.computeBoundingSphere();
      Hd.copy(b.boundingSphere).applyMatrix4(a.matrixWorld);
      return this.intersectsSphere(Hd)
    },
    intersectsSprite: function(a) {
      Hd.center.set(0, 0, 0);
      Hd.radius = .7071067811865476;
      Hd.applyMatrix4(a.matrixWorld);
      return this.intersectsSphere(Hd)
    },
    intersectsSphere: function(a) {
      var b = this.planes,
        c = a.center;
      a = -a.radius;
      for (var d = 0; 6 > d; d++)
        if (b[d].distanceToPoint(c) <
          a) return !1;
      return !0
    },
    intersectsBox: function(a) {
      for (var b = this.planes, c = 0; 6 > c; c++) {
        var d = b[c];
        Yf.x = 0 < d.normal.x ? a.max.x : a.min.x;
        Yf.y = 0 < d.normal.y ? a.max.y : a.min.y;
        Yf.z = 0 < d.normal.z ? a.max.z : a.min.z;
        if (0 > d.distanceToPoint(Yf)) return !1
      }
      return !0
    },
    containsPoint: function(a) {
      for (var b = this.planes, c = 0; 6 > c; c++)
        if (0 > b[c].distanceToPoint(a)) return !1;
      return !0
    }
  });
  var Q = {
      alphamap_fragment: "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif",
      alphamap_pars_fragment: "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",
      alphatest_fragment: "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif",
      aomap_fragment: "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif",
      aomap_pars_fragment: "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",
      begin_vertex: "vec3 transformed = vec3( position );",
      beginnormal_vertex: "vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif",
      bsdfs: "vec2 integrateSpecularBRDF( const in float dotNV, const in float roughness ) {\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\treturn vec2( -1.04, 1.04 ) * a004 + r.zw;\n}\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\n\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\n\treturn Fr * fresnel + F0;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + viewDir );\n\tfloat dotNL = saturate( dot( normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE  = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS  = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie(float roughness, float NoH) {\n\tfloat invAlpha  = 1.0 / roughness;\n\tfloat cos2h = NoH * NoH;\n\tfloat sin2h = max(1.0 - cos2h, 0.0078125);\treturn (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\n}\nfloat V_Neubelt(float NoV, float NoL) {\n\treturn saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV)));\n}\nvec3 BRDF_Specular_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 H = normalize( V + L );\n\tfloat dotNH = saturate( dot( N, H ) );\n\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\n}\n#endif",
      bumpmap_pars_fragment: "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",
      clipping_planes_fragment: "#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",
      clipping_planes_pars_fragment: "#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( STANDARD ) && ! defined( PHONG ) && ! defined( MATCAP )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",
      clipping_planes_pars_vertex: "#if NUM_CLIPPING_PLANES > 0 && ! defined( STANDARD ) && ! defined( PHONG ) && ! defined( MATCAP )\n\tvarying vec3 vViewPosition;\n#endif",
      clipping_planes_vertex: "#if NUM_CLIPPING_PLANES > 0 && ! defined( STANDARD ) && ! defined( PHONG ) && ! defined( MATCAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif",
      color_fragment: "#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",
      color_pars_fragment: "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",
      color_pars_vertex: "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",
      color_vertex: "#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",
      common: "#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n  return m[ 2 ][ 3 ] == - 1.0;\n}",
      cube_uv_reflection_fragment: "#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1  (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale =  bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV( sampler2D envMap, vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif",
      defaultnormal_vertex: "vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\ttransformedNormal = mat3( instanceMatrix ) * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = normalMatrix * objectTangent;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",
      displacementmap_pars_vertex: "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",
      displacementmap_vertex: "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",
      emissivemap_fragment: "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",
      emissivemap_pars_fragment: "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",
      encodings_fragment: "gl_FragColor = linearToOutputTexel( gl_FragColor );",
      encodings_pars_fragment: "\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value )  {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}",
      envmap_fragment: "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\t\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t}  else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",
      envmap_common_pars_fragment: "#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",
      envmap_pars_fragment: "#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",
      envmap_pars_vertex: "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",
      envmap_physical_pars_fragment: "#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float roughness, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat sigma = PI * roughness * roughness / ( 1.0 + roughness );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + log2( sigma );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t  vec3 reflectVec = reflect( -viewDir, normal );\n\t\t  reflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t#else\n\t\t  vec3 reflectVec = refract( -viewDir, normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( roughness, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, queryReflectVec, roughness );\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif",
      envmap_vertex: "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) { \n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",
      fog_vertex: "#ifdef USE_FOG\n\tfogDepth = -mvPosition.z;\n#endif",
      fog_pars_vertex: "#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif",
      fog_fragment: "#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",
      fog_pars_fragment: "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",
      gradientmap_pars_fragment: "#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif",
      lightmap_fragment: "#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif",
      lightmap_pars_fragment: "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",
      lights_lambert_vertex: "vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif",
      lights_pars_begin: "uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\n\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight  ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif",
      lights_phong_fragment: "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",
      lights_phong_pars_fragment: "varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)",
      lights_physical_fragment: "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef REFLECTIVITY\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#endif\n#ifdef CLEARCOAT\n\tmaterial.clearcoat = saturate( clearcoat );\tmaterial.clearcoatRoughness = clamp( clearcoatRoughness, 0.04, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheen;\n#endif",
      lights_physical_pars_fragment: "struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n#ifdef CLEARCOAT\n\tfloat clearcoat;\n\tfloat clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tvec3 sheenColor;\n#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearcoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(    0, 1,    0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNL = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = ccDotNL * directLight.color;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tccIrradiance *= PI;\n\t\t#endif\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t\treflectedLight.directSpecular += ccIrradiance * material.clearcoat * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_Sheen(\n\t\t\tmaterial.specularRoughness,\n\t\t\tdirectLight.direction,\n\t\t\tgeometry,\n\t\t\tmaterial.sheenColor\n\t\t);\n\t#else\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularRoughness);\n\t#endif\n\treflectedLight.directDiffuse += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNV = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular += clearcoatRadiance * material.clearcoat * BRDF_Specular_GGX_Environment( geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t\tfloat ccDotNL = ccDotNV;\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\tfloat clearcoatInv = 1.0 - clearcoatDHR;\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += clearcoatInv * radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",
      lights_fragment_begin: "\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tdirectLight.color *= all( bvec3( pointLight.shadow, directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tdirectLight.color *= all( bvec3( spotLight.shadow, directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectLight.color *= all( bvec3( directionalLight.shadow, directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",
      lights_fragment_maps: "#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.normal, material.specularRoughness, maxMipLevel );\n\t#ifdef CLEARCOAT\n\t\tclearcoatRadiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, maxMipLevel );\n\t#endif\n#endif",
      lights_fragment_end: "#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",
      logdepthbuf_fragment: "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",
      logdepthbuf_pars_fragment: "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",
      logdepthbuf_pars_vertex: "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",
      logdepthbuf_vertex: "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",
      map_fragment: "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif",
      map_pars_fragment: "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",
      map_particle_fragment: "#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",
      map_particle_pars_fragment: "#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",
      metalnessmap_fragment: "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",
      metalnessmap_pars_fragment: "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",
      morphnormal_vertex: "#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif",
      morphtarget_pars_vertex: "#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",
      morphtarget_vertex: "#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif",
      normal_fragment_begin: "#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\tbitangent = bitangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",
      normal_fragment_maps: "#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\t#ifdef USE_TANGENT\n\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal, normalScale, normalMap );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif",
      normalmap_pars_fragment: "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec2 normalScale, in sampler2D normalMap ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\n\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy *= normalScale;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tbool frontFacing = dot( cross( S, T ), N ) > 0.0;\n\t\t\tmapN.xy *= ( float( frontFacing ) * 2.0 - 1.0 );\n\t\t#else\n\t\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif",
      clearcoat_normal_fragment_begin: "#ifdef CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",
      clearcoat_normal_fragment_maps: "#ifdef USE_CLEARCOAT_NORMALMAP\n\t#ifdef USE_TANGENT\n\t\tmat3 vTBN = mat3( tangent, bitangent, clearcoatNormal );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = clearcoatNormalScale * mapN.xy;\n\t\tclearcoatNormal = normalize( vTBN * mapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatNormalScale, clearcoatNormalMap );\n\t#endif\n#endif",
      clearcoat_normalmap_pars_fragment: "#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",
      packing: "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256.,  256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 encodeHalfRGBA ( vec2 v ) {\n\tvec4 encoded = vec4( 0.0 );\n\tconst vec2 offset = vec2( 1.0 / 255.0, 0.0 );\n\tencoded.xy = vec2( v.x, fract( v.x * 255.0 ) );\n\tencoded.xy = encoded.xy - ( encoded.yy * offset );\n\tencoded.zw = vec2( v.y, fract( v.y * 255.0 ) );\n\tencoded.zw = encoded.zw - ( encoded.ww * offset );\n\treturn encoded;\n}\nvec2 decodeHalfRGBA( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",
      premultiplied_alpha_fragment: "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",
      project_vertex: "vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",
      dithering_fragment: "#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",
      dithering_pars_fragment: "#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",
      roughnessmap_fragment: "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",
      roughnessmap_pars_fragment: "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",
      shadowmap_pars_fragment: "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn decodeHalfRGBA( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = ( floor( uv * size - 0.5 ) + 0.5 ) * texelSize;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",
      shadowmap_pars_vertex: "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",
      shadowmap_vertex: "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif",
      shadowmask_pars_fragment: "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= all( bvec2( directionalLight.shadow, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= all( bvec2( spotLight.shadow, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= all( bvec2( pointLight.shadow, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}",
      skinbase_vertex: "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",
      skinning_pars_vertex: "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif",
      skinning_vertex: "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",
      skinnormal_vertex: "#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix  = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",
      specularmap_fragment: "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",
      specularmap_pars_fragment: "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",
      tonemapping_fragment: "#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",
      tonemapping_pars_fragment: "#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( ( color * ( 2.51 * color + 0.03 ) ) / ( color * ( 2.43 * color + 0.59 ) + 0.14 ) );\n}",
      uv_pars_fragment: "#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",
      uv_pars_vertex: "#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",
      uv_vertex: "#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",
      uv2_pars_fragment: "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",
      uv2_pars_vertex: "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif",
      uv2_vertex: "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",
      worldpos_vertex: "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",
      background_frag: "uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",
      background_vert: "varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",
      cube_frag: "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\tgl_FragColor.a *= opacity;\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",
      cube_vert: "varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}",
      depth_frag: "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}",
      depth_vert: "#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}",
      distanceRGBA_frag: "#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",
      distanceRGBA_vert: "#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}",
      equirect_frag: "uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",
      equirect_vert: "varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}",
      linedashed_frag: "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",
      linedashed_vert: "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}",
      meshbasic_frag: "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",
      meshbasic_vert: "#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}",
      meshlambert_frag: "uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
      meshlambert_vert: "#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
      meshmatcap_frag: "#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",
      meshmatcap_vert: "#define MATCAP\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#ifndef FLAT_SHADED\n\t\tvNormal = normalize( transformedNormal );\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\tvViewPosition = - mvPosition.xyz;\n}",
      meshphong_frag: "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
      meshphong_vert: "#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
      meshphysical_frag: "#define STANDARD\n#ifdef PHYSICAL\n\t#define REFLECTIVITY\n\t#define CLEARCOAT\n\t#define TRANSPARENCY\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef TRANSPARENCY\n\tuniform float transparency;\n#endif\n#ifdef REFLECTIVITY\n\tuniform float reflectivity;\n#endif\n#ifdef CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheen;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <clearcoat_normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <clearcoat_normal_fragment_begin>\n\t#include <clearcoat_normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#ifdef TRANSPARENCY\n\t\tdiffuseColor.a *= saturate( 1. - transparency + linearToRelativeLuminance( reflectedLight.directSpecular + reflectedLight.indirectSpecular ) );\n\t#endif\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
      meshphysical_vert: "#define STANDARD\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
      normal_frag: "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}",
      normal_vert: "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",
      points_frag: "uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",
      points_vert: "uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}",
      shadow_frag: "uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <fog_fragment>\n}",
      shadow_vert: "#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
      sprite_frag: "uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",
      sprite_vert: "uniform float rotation;\nuniform vec2 center;\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}"
    },
    K = {
      common: {
        diffuse: {
          value: new D(15658734)
        },
        opacity: {
          value: 1
        },
        map: {
          value: null
        },
        uvTransform: {
          value: new ka
        },
        alphaMap: {
          value: null
        }
      },
      specularmap: {
        specularMap: {
          value: null
        }
      },
      envmap: {
        envMap: {
          value: null
        },
        flipEnvMap: {
          value: -1
        },
        reflectivity: {
          value: 1
        },
        refractionRatio: {
          value: .98
        },
        maxMipLevel: {
          value: 0
        }
      },
      aomap: {
        aoMap: {
          value: null
        },
        aoMapIntensity: {
          value: 1
        }
      },
      lightmap: {
        lightMap: {
          value: null
        },
        lightMapIntensity: {
          value: 1
        }
      },
      emissivemap: {
        emissiveMap: {
          value: null
        }
      },
      bumpmap: {
        bumpMap: {
          value: null
        },
        bumpScale: {
          value: 1
        }
      },
      normalmap: {
        normalMap: {
          value: null
        },
        normalScale: {
          value: new z(1, 1)
        }
      },
      displacementmap: {
        displacementMap: {
          value: null
        },
        displacementScale: {
          value: 1
        },
        displacementBias: {
          value: 0
        }
      },
      roughnessmap: {
        roughnessMap: {
          value: null
        }
      },
      metalnessmap: {
        metalnessMap: {
          value: null
        }
      },
      gradientmap: {
        gradientMap: {
          value: null
        }
      },
      fog: {
        fogDensity: {
          value: 2.5E-4
        },
        fogNear: {
          value: 1
        },
        fogFar: {
          value: 2E3
        },
        fogColor: {
          value: new D(16777215)
        }
      },
      lights: {
        ambientLightColor: {
          value: []
        },
        lightProbe: {
          value: []
        },
        directionalLights: {
          value: [],
          properties: {
            direction: {},
            color: {},
            shadow: {},
            shadowBias: {},
            shadowRadius: {},
            shadowMapSize: {}
          }
        },
        directionalShadowMap: {
          value: []
        },
        directionalShadowMatrix: {
          value: []
        },
        spotLights: {
          value: [],
          properties: {
            color: {},
            position: {},
            direction: {},
            distance: {},
            coneCos: {},
            penumbraCos: {},
            decay: {},
            shadow: {},
            shadowBias: {},
            shadowRadius: {},
            shadowMapSize: {}
          }
        },
        spotShadowMap: {
          value: []
        },
        spotShadowMatrix: {
          value: []
        },
        pointLights: {
          value: [],
          properties: {
            color: {},
            position: {},
            decay: {},
            distance: {},
            shadow: {},
            shadowBias: {},
            shadowRadius: {},
            shadowMapSize: {},
            shadowCameraNear: {},
            shadowCameraFar: {}
          }
        },
        pointShadowMap: {
          value: []
        },
        pointShadowMatrix: {
          value: []
        },
        hemisphereLights: {
          value: [],
          properties: {
            direction: {},
            skyColor: {},
            groundColor: {}
          }
        },
        rectAreaLights: {
          value: [],
          properties: {
            color: {},
            position: {},
            width: {},
            height: {}
          }
        }
      },
      points: {
        diffuse: {
          value: new D(15658734)
        },
        opacity: {
          value: 1
        },
        size: {
          value: 1
        },
        scale: {
          value: 1
        },
        map: {
          value: null
        },
        alphaMap: {
          value: null
        },
        uvTransform: {
          value: new ka
        }
      },
      sprite: {
        diffuse: {
          value: new D(15658734)
        },
        opacity: {
          value: 1
        },
        center: {
          value: new z(.5, .5)
        },
        rotation: {
          value: 0
        },
        map: {
          value: null
        },
        alphaMap: {
          value: null
        },
        uvTransform: {
          value: new ka
        }
      }
    },
    ib = {
      basic: {
        uniforms: za([K.common, K.specularmap, K.envmap, K.aomap, K.lightmap, K.fog]),
        vertexShader: Q.meshbasic_vert,
        fragmentShader: Q.meshbasic_frag
      },
      lambert: {
        uniforms: za([K.common, K.specularmap, K.envmap, K.aomap, K.lightmap, K.emissivemap, K.fog, K.lights, {
          emissive: {
            value: new D(0)
          }
        }]),
        vertexShader: Q.meshlambert_vert,
        fragmentShader: Q.meshlambert_frag
      },
      phong: {
        uniforms: za([K.common, K.specularmap, K.envmap, K.aomap, K.lightmap, K.emissivemap, K.bumpmap, K.normalmap, K.displacementmap, K.gradientmap,
          K.fog, K.lights, {
            emissive: {
              value: new D(0)
            },
            specular: {
              value: new D(1118481)
            },
            shininess: {
              value: 30
            }
          }
        ]),
        vertexShader: Q.meshphong_vert,
        fragmentShader: Q.meshphong_frag
      },
      standard: {
        uniforms: za([K.common, K.envmap, K.aomap, K.lightmap, K.emissivemap, K.bumpmap, K.normalmap, K.displacementmap, K.roughnessmap, K.metalnessmap, K.fog, K.lights, {
          emissive: {
            value: new D(0)
          },
          roughness: {
            value: .5
          },
          metalness: {
            value: .5
          },
          envMapIntensity: {
            value: 1
          }
        }]),
        vertexShader: Q.meshphysical_vert,
        fragmentShader: Q.meshphysical_frag
      },
      matcap: {
        uniforms: za([K.common,
          K.bumpmap, K.normalmap, K.displacementmap, K.fog, {
            matcap: {
              value: null
            }
          }
        ]),
        vertexShader: Q.meshmatcap_vert,
        fragmentShader: Q.meshmatcap_frag
      },
      points: {
        uniforms: za([K.points, K.fog]),
        vertexShader: Q.points_vert,
        fragmentShader: Q.points_frag
      },
      dashed: {
        uniforms: za([K.common, K.fog, {
          scale: {
            value: 1
          },
          dashSize: {
            value: 1
          },
          totalSize: {
            value: 2
          }
        }]),
        vertexShader: Q.linedashed_vert,
        fragmentShader: Q.linedashed_frag
      },
      depth: {
        uniforms: za([K.common, K.displacementmap]),
        vertexShader: Q.depth_vert,
        fragmentShader: Q.depth_frag
      },
      normal: {
        uniforms: za([K.common,
          K.bumpmap, K.normalmap, K.displacementmap, {
            opacity: {
              value: 1
            }
          }
        ]),
        vertexShader: Q.normal_vert,
        fragmentShader: Q.normal_frag
      },
      sprite: {
        uniforms: za([K.sprite, K.fog]),
        vertexShader: Q.sprite_vert,
        fragmentShader: Q.sprite_frag
      },
      background: {
        uniforms: {
          uvTransform: {
            value: new ka
          },
          t2D: {
            value: null
          }
        },
        vertexShader: Q.background_vert,
        fragmentShader: Q.background_frag
      },
      cube: {
        uniforms: {
          tCube: {
            value: null
          },
          tFlip: {
            value: -1
          },
          opacity: {
            value: 1
          }
        },
        vertexShader: Q.cube_vert,
        fragmentShader: Q.cube_frag
      },
      equirect: {
        uniforms: {
          tEquirect: {
            value: null
          }
        },
        vertexShader: Q.equirect_vert,
        fragmentShader: Q.equirect_frag
      },
      distanceRGBA: {
        uniforms: za([K.common, K.displacementmap, {
          referencePosition: {
            value: new q
          },
          nearDistance: {
            value: 1
          },
          farDistance: {
            value: 1E3
          }
        }]),
        vertexShader: Q.distanceRGBA_vert,
        fragmentShader: Q.distanceRGBA_frag
      },
      shadow: {
        uniforms: za([K.lights, K.fog, {
          color: {
            value: new D(0)
          },
          opacity: {
            value: 1
          }
        }]),
        vertexShader: Q.shadow_vert,
        fragmentShader: Q.shadow_frag
      }
    };
  ib.physical = {
    uniforms: za([ib.standard.uniforms, {
      transparency: {
        value: 0
      },
      clearcoat: {
        value: 0
      },
      clearcoatRoughness: {
        value: 0
      },
      sheen: {
        value: new D(0)
      },
      clearcoatNormalScale: {
        value: new z(1, 1)
      },
      clearcoatNormalMap: {
        value: null
      }
    }]),
    vertexShader: Q.meshphysical_vert,
    fragmentShader: Q.meshphysical_frag
  };
  Td.prototype = Object.create(P.prototype);
  Td.prototype.constructor = Td;
  ic.prototype = Object.create(G.prototype);
  ic.prototype.constructor = ic;
  vb.prototype = Object.create(S.prototype);
  vb.prototype.constructor = vb;
  vb.prototype.isCubeTexture = !0;
  Object.defineProperty(vb.prototype, "images", {
    get: function() {
      return this.image
    },
    set: function(a) {
      this.image =
        a
    }
  });
  Rc.prototype = Object.create(S.prototype);
  Rc.prototype.constructor = Rc;
  Rc.prototype.isDataTexture2DArray = !0;
  Sc.prototype = Object.create(S.prototype);
  Sc.prototype.constructor = Sc;
  Sc.prototype.isDataTexture3D = !0;
  var gi = new S,
    ok = new Rc,
    qk = new Sc,
    hi = new vb,
    ai = [],
    ci = [],
    fi = new Float32Array(16),
    ei = new Float32Array(9),
    di = new Float32Array(4);
  ii.prototype.updateCache = function(a) {
    var b = this.cache;
    a instanceof Float32Array && b.length !== a.length && (this.cache = new Float32Array(a.length));
    Ja(b, a)
  };
  ji.prototype.setValue =
    function(a, b, c) {
      for (var d = this.seq, f = 0, g = d.length; f !== g; ++f) {
        var k = d[f];
        k.setValue(a, b[k.id], c)
      }
    };
  var Ag = /([\w\d_]+)(\])?(\[|\.)?/g;
  Jb.prototype.setValue = function(a, b, c, d) {
    b = this.map[b];
    void 0 !== b && b.setValue(a, c, d)
  };
  Jb.prototype.setOptional = function(a, b, c) {
    b = b[c];
    void 0 !== b && this.setValue(a, c, b)
  };
  Jb.upload = function(a, b, c, d) {
    for (var f = 0, g = b.length; f !== g; ++f) {
      var k = b[f],
        m = c[k.id];
      !1 !== m.needsUpdate && k.setValue(a, m.value, d)
    }
  };
  Jb.seqWithValue = function(a, b) {
    for (var c = [], d = 0, f = a.length; d !== f; ++d) {
      var g =
        a[d];
      g.id in b && c.push(g)
    }
    return c
  };
  var Vk = 0,
    Cg = /^[ \t]*#include +<([\w\d./]+)>/gm,
    ri = /#pragma unroll_loop[\s]+?for \( int i = (\d+); i < (\d+); i \+\+ \) \{([\s\S]+?)(?=\})\}/g,
    dl = 0;
  Kb.prototype = Object.create(R.prototype);
  Kb.prototype.constructor = Kb;
  Kb.prototype.isMeshDepthMaterial = !0;
  Kb.prototype.copy = function(a) {
    R.prototype.copy.call(this, a);
    this.depthPacking = a.depthPacking;
    this.skinning = a.skinning;
    this.morphTargets = a.morphTargets;
    this.map = a.map;
    this.alphaMap = a.alphaMap;
    this.displacementMap = a.displacementMap;
    this.displacementScale = a.displacementScale;
    this.displacementBias = a.displacementBias;
    this.wireframe = a.wireframe;
    this.wireframeLinewidth = a.wireframeLinewidth;
    return this
  };
  Lb.prototype = Object.create(R.prototype);
  Lb.prototype.constructor = Lb;
  Lb.prototype.isMeshDistanceMaterial = !0;
  Lb.prototype.copy = function(a) {
    R.prototype.copy.call(this, a);
    this.referencePosition.copy(a.referencePosition);
    this.nearDistance = a.nearDistance;
    this.farDistance = a.farDistance;
    this.skinning = a.skinning;
    this.morphTargets = a.morphTargets;
    this.map = a.map;
    this.alphaMap = a.alphaMap;
    this.displacementMap = a.displacementMap;
    this.displacementScale = a.displacementScale;
    this.displacementBias = a.displacementBias;
    return this
  };
  Fg.prototype = Object.assign(Object.create(sa.prototype), {
    constructor: Fg,
    isWebGLMultiviewRenderTarget: !0,
    copy: function(a) {
      sa.prototype.copy.call(this, a);
      this.numViews = a.numViews;
      return this
    },
    setNumViews: function(a) {
      this.numViews !== a && (this.numViews = a, this.dispose());
      return this
    }
  });
  Vc.prototype = Object.assign(Object.create(E.prototype), {
    constructor: Vc,
    isGroup: !0
  });
  Yd.prototype = Object.assign(Object.create(na.prototype), {
    constructor: Yd,
    isArrayCamera: !0
  });
  var yi = new q,
    zi = new q;
  Object.assign(Gg.prototype, Ra.prototype);
  Object.assign(Ai.prototype, Ra.prototype);
  Object.assign(cf.prototype, {
    isFogExp2: !0,
    clone: function() {
      return new cf(this.color, this.density)
    },
    toJSON: function() {
      return {
        type: "FogExp2",
        color: this.color.getHex(),
        density: this.density
      }
    }
  });
  Object.assign(df.prototype, {
    isFog: !0,
    clone: function() {
      return new df(this.color, this.near,
        this.far)
    },
    toJSON: function() {
      return {
        type: "Fog",
        color: this.color.getHex(),
        near: this.near,
        far: this.far
      }
    }
  });
  Object.defineProperty(wb.prototype, "needsUpdate", {
    set: function(a) {
      !0 === a && this.version++
    }
  });
  Object.assign(wb.prototype, {
    isInterleavedBuffer: !0,
    onUploadCallback: function() {},
    setUsage: function(a) {
      this.usage = a;
      return this
    },
    copy: function(a) {
      this.array = new a.array.constructor(a.array);
      this.count = a.count;
      this.stride = a.stride;
      this.usage = a.usage;
      return this
    },
    copyAt: function(a, b, c) {
      a *= this.stride;
      c *= b.stride;
      for (var d = 0, f = this.stride; d < f; d++) this.array[a + d] = b.array[c + d];
      return this
    },
    set: function(a, b) {
      void 0 === b && (b = 0);
      this.array.set(a, b);
      return this
    },
    clone: function() {
      return (new this.constructor).copy(this)
    },
    onUpload: function(a) {
      this.onUploadCallback = a;
      return this
    }
  });
  Object.defineProperties(Zd.prototype, {
    count: {
      get: function() {
        return this.data.count
      }
    },
    array: {
      get: function() {
        return this.data.array
      }
    }
  });
  Object.assign(Zd.prototype, {
    isInterleavedBufferAttribute: !0,
    setX: function(a, b) {
      this.data.array[a * this.data.stride +
        this.offset] = b;
      return this
    },
    setY: function(a, b) {
      this.data.array[a * this.data.stride + this.offset + 1] = b;
      return this
    },
    setZ: function(a, b) {
      this.data.array[a * this.data.stride + this.offset + 2] = b;
      return this
    },
    setW: function(a, b) {
      this.data.array[a * this.data.stride + this.offset + 3] = b;
      return this
    },
    getX: function(a) {
      return this.data.array[a * this.data.stride + this.offset]
    },
    getY: function(a) {
      return this.data.array[a * this.data.stride + this.offset + 1]
    },
    getZ: function(a) {
      return this.data.array[a * this.data.stride + this.offset + 2]
    },
    getW: function(a) {
      return this.data.array[a * this.data.stride + this.offset + 3]
    },
    setXY: function(a, b, c) {
      a = a * this.data.stride + this.offset;
      this.data.array[a + 0] = b;
      this.data.array[a + 1] = c;
      return this
    },
    setXYZ: function(a, b, c, d) {
      a = a * this.data.stride + this.offset;
      this.data.array[a + 0] = b;
      this.data.array[a + 1] = c;
      this.data.array[a + 2] = d;
      return this
    },
    setXYZW: function(a, b, c, d, f) {
      a = a * this.data.stride + this.offset;
      this.data.array[a + 0] = b;
      this.data.array[a + 1] = c;
      this.data.array[a + 2] = d;
      this.data.array[a + 3] = f;
      return this
    }
  });
  Nb.prototype =
    Object.create(R.prototype);
  Nb.prototype.constructor = Nb;
  Nb.prototype.isSpriteMaterial = !0;
  Nb.prototype.copy = function(a) {
    R.prototype.copy.call(this, a);
    this.color.copy(a.color);
    this.map = a.map;
    this.alphaMap = a.alphaMap;
    this.rotation = a.rotation;
    this.sizeAttenuation = a.sizeAttenuation;
    return this
  };
  var Wc, Qe = new q,
    Id = new q,
    Jd = new q,
    Xc = new z,
    ae = new z,
    Ci = new I,
    Zf = new q,
    Re = new q,
    $f = new q,
    qj = new z,
    Fh = new z,
    rj = new z;
  $d.prototype = Object.assign(Object.create(E.prototype), {
    constructor: $d,
    isSprite: !0,
    raycast: function(a,
      b) {
      null === a.camera && console.error('THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.');
      Id.setFromMatrixScale(this.matrixWorld);
      Ci.copy(a.camera.matrixWorld);
      this.modelViewMatrix.multiplyMatrices(a.camera.matrixWorldInverse, this.matrixWorld);
      Jd.setFromMatrixPosition(this.modelViewMatrix);
      a.camera.isPerspectiveCamera && !1 === this.material.sizeAttenuation && Id.multiplyScalar(-Jd.z);
      var c = this.material.rotation;
      if (0 !== c) {
        var d = Math.cos(c);
        var f = Math.sin(c)
      }
      c = this.center;
      ef(Zf.set(-.5, -.5, 0), Jd, c, Id, f, d);
      ef(Re.set(.5, -.5, 0), Jd, c, Id, f, d);
      ef($f.set(.5, .5, 0), Jd, c, Id, f, d);
      qj.set(0, 0);
      Fh.set(1, 0);
      rj.set(1, 1);
      var g = a.ray.intersectTriangle(Zf, Re, $f, !1, Qe);
      if (null === g && (ef(Re.set(-.5, .5, 0), Jd, c, Id, f, d), Fh.set(0, 1), g = a.ray.intersectTriangle(Zf, $f, Re, !1, Qe), null === g)) return;
      f = a.ray.origin.distanceTo(Qe);
      f < a.near || f > a.far || b.push({
        distance: f,
        point: Qe.clone(),
        uv: va.getUV(Qe, Zf, Re, $f, qj, Fh, rj, new z),
        face: null,
        object: this
      })
    },
    clone: function() {
      return (new this.constructor(this.material)).copy(this)
    },
    copy: function(a) {
      E.prototype.copy.call(this, a);
      void 0 !== a.center && this.center.copy(a.center);
      return this
    }
  });
  var ag = new q,
    sj = new q;
  be.prototype = Object.assign(Object.create(E.prototype), {
    constructor: be,
    isLOD: !0,
    copy: function(a) {
      E.prototype.copy.call(this, a, !1);
      a = a.levels;
      for (var b = 0, c = a.length; b < c; b++) {
        var d = a[b];
        this.addLevel(d.object.clone(), d.distance)
      }
      return this
    },
    addLevel: function(a, b) {
      void 0 === b && (b = 0);
      b = Math.abs(b);
      for (var c = this.levels, d = 0; d < c.length && !(b < c[d].distance); d++);
      c.splice(d, 0, {
        distance: b,
        object: a
      });
      this.add(a);
      return this
    },
    getObjectForDistance: function(a) {
      for (var b = this.levels, c = 1, d = b.length; c < d && !(a < b[c].distance); c++);
      return b[c - 1].object
    },
    raycast: function(a, b) {
      ag.setFromMatrixPosition(this.matrixWorld);
      var c = a.ray.origin.distanceTo(ag);
      this.getObjectForDistance(c).raycast(a, b)
    },
    update: function(a) {
      var b = this.levels;
      if (1 < b.length) {
        ag.setFromMatrixPosition(a.matrixWorld);
        sj.setFromMatrixPosition(this.matrixWorld);
        a = ag.distanceTo(sj);
        b[0].object.visible = !0;
        for (var c = 1, d = b.length; c <
          d; c++)
          if (a >= b[c].distance) b[c - 1].object.visible = !1, b[c].object.visible = !0;
          else break;
        for (; c < d; c++) b[c].object.visible = !1
      }
    },
    toJSON: function(a) {
      a = E.prototype.toJSON.call(this, a);
      a.object.levels = [];
      for (var b = this.levels, c = 0, d = b.length; c < d; c++) {
        var f = b[c];
        a.object.levels.push({
          object: f.object.uuid,
          distance: f.distance
        })
      }
      return a
    }
  });
  ce.prototype = Object.assign(Object.create(ia.prototype), {
    constructor: ce,
    isSkinnedMesh: !0,
    bind: function(a, b) {
      this.skeleton = a;
      void 0 === b && (this.updateMatrixWorld(!0), this.skeleton.calculateInverses(),
        b = this.matrixWorld);
      this.bindMatrix.copy(b);
      this.bindMatrixInverse.getInverse(b)
    },
    pose: function() {
      this.skeleton.pose()
    },
    normalizeSkinWeights: function() {
      for (var a = new ca, b = this.geometry.attributes.skinWeight, c = 0, d = b.count; c < d; c++) {
        a.x = b.getX(c);
        a.y = b.getY(c);
        a.z = b.getZ(c);
        a.w = b.getW(c);
        var f = 1 / a.manhattanLength();
        Infinity !== f ? a.multiplyScalar(f) : a.set(1, 0, 0, 0);
        b.setXYZW(c, a.x, a.y, a.z, a.w)
      }
    },
    updateMatrixWorld: function(a) {
      ia.prototype.updateMatrixWorld.call(this, a);
      "attached" === this.bindMode ? this.bindMatrixInverse.getInverse(this.matrixWorld) :
        "detached" === this.bindMode ? this.bindMatrixInverse.getInverse(this.bindMatrix) : console.warn("THREE.SkinnedMesh: Unrecognized bindMode: " + this.bindMode)
    },
    clone: function() {
      return (new this.constructor(this.geometry, this.material)).copy(this)
    }
  });
  var tj = new I,
    Ll = new I;
  Object.assign(ff.prototype, {
    calculateInverses: function() {
      this.boneInverses = [];
      for (var a = 0, b = this.bones.length; a < b; a++) {
        var c = new I;
        this.bones[a] && c.getInverse(this.bones[a].matrixWorld);
        this.boneInverses.push(c)
      }
    },
    pose: function() {
      var a, b;
      var c = 0;
      for (b = this.bones.length; c < b; c++)(a = this.bones[c]) && a.matrixWorld.getInverse(this.boneInverses[c]);
      c = 0;
      for (b = this.bones.length; c < b; c++)
        if (a = this.bones[c]) a.parent && a.parent.isBone ? (a.matrix.getInverse(a.parent.matrixWorld), a.matrix.multiply(a.matrixWorld)) : a.matrix.copy(a.matrixWorld), a.matrix.decompose(a.position, a.quaternion, a.scale)
    },
    update: function() {
      for (var a = this.bones, b = this.boneInverses, c = this.boneMatrices, d = this.boneTexture, f = 0, g = a.length; f < g; f++) tj.multiplyMatrices(a[f] ? a[f].matrixWorld :
        Ll, b[f]), tj.toArray(c, 16 * f);
      void 0 !== d && (d.needsUpdate = !0)
    },
    clone: function() {
      return new ff(this.bones, this.boneInverses)
    },
    getBoneByName: function(a) {
      for (var b = 0, c = this.bones.length; b < c; b++) {
        var d = this.bones[b];
        if (d.name === a) return d
      }
    }
  });
  Ig.prototype = Object.assign(Object.create(E.prototype), {
    constructor: Ig,
    isBone: !0
  });
  gf.prototype = Object.assign(Object.create(ia.prototype), {
    constructor: gf,
    isInstancedMesh: !0,
    raycast: function() {},
    setMatrixAt: function(a, b) {
      b.toArray(this.instanceMatrix.array, 16 * a)
    },
    updateMorphTargets: function() {}
  });
  T.prototype = Object.create(R.prototype);
  T.prototype.constructor = T;
  T.prototype.isLineBasicMaterial = !0;
  T.prototype.copy = function(a) {
    R.prototype.copy.call(this, a);
    this.color.copy(a.color);
    this.linewidth = a.linewidth;
    this.linecap = a.linecap;
    this.linejoin = a.linejoin;
    return this
  };
  var uj = new q,
    vj = new q,
    wj = new I,
    bg = new ac,
    Se = new ub;
  pa.prototype = Object.assign(Object.create(E.prototype), {
    constructor: pa,
    isLine: !0,
    computeLineDistances: function() {
      var a = this.geometry;
      if (a.isBufferGeometry)
        if (null === a.index) {
          for (var b =
              a.attributes.position, c = [0], d = 1, f = b.count; d < f; d++) uj.fromBufferAttribute(b, d - 1), vj.fromBufferAttribute(b, d), c[d] = c[d - 1], c[d] += uj.distanceTo(vj);
          a.setAttribute("lineDistance", new F(c, 1))
        } else console.warn("THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");
      else if (a.isGeometry)
        for (b = a.vertices, c = a.lineDistances, c[0] = 0, d = 1, f = b.length; d < f; d++) c[d] = c[d - 1], c[d] += b[d - 1].distanceTo(b[d]);
      return this
    },
    raycast: function(a, b) {
      var c = a.linePrecision,
        d = this.geometry,
        f = this.matrixWorld;
      null === d.boundingSphere && d.computeBoundingSphere();
      Se.copy(d.boundingSphere);
      Se.applyMatrix4(f);
      Se.radius += c;
      if (!1 !== a.ray.intersectsSphere(Se)) {
        wj.getInverse(f);
        bg.copy(a.ray).applyMatrix4(wj);
        c /= (this.scale.x + this.scale.y + this.scale.z) / 3;
        c *= c;
        var g = new q,
          k = new q;
        f = new q;
        var m = new q,
          l = this && this.isLineSegments ? 2 : 1;
        if (d.isBufferGeometry) {
          var p = d.index,
            y = d.attributes.position.array;
          if (null !== p) {
            p = p.array;
            d = 0;
            for (var t = p.length - 1; d < t; d += l) {
              var r = p[d + 1];
              g.fromArray(y, 3 * p[d]);
              k.fromArray(y,
                3 * r);
              r = bg.distanceSqToSegment(g, k, m, f);
              r > c || (m.applyMatrix4(this.matrixWorld), r = a.ray.origin.distanceTo(m), r < a.near || r > a.far || b.push({
                distance: r,
                point: f.clone().applyMatrix4(this.matrixWorld),
                index: d,
                face: null,
                faceIndex: null,
                object: this
              }))
            }
          } else
            for (d = 0, t = y.length / 3 - 1; d < t; d += l) g.fromArray(y, 3 * d), k.fromArray(y, 3 * d + 3), r = bg.distanceSqToSegment(g, k, m, f), r > c || (m.applyMatrix4(this.matrixWorld), r = a.ray.origin.distanceTo(m), r < a.near || r > a.far || b.push({
              distance: r,
              point: f.clone().applyMatrix4(this.matrixWorld),
              index: d,
              face: null,
              faceIndex: null,
              object: this
            }))
        } else if (d.isGeometry)
          for (g = d.vertices, k = g.length, d = 0; d < k - 1; d += l) r = bg.distanceSqToSegment(g[d], g[d + 1], m, f), r > c || (m.applyMatrix4(this.matrixWorld), r = a.ray.origin.distanceTo(m), r < a.near || r > a.far || b.push({
            distance: r,
            point: f.clone().applyMatrix4(this.matrixWorld),
            index: d,
            face: null,
            faceIndex: null,
            object: this
          }))
      }
    },
    clone: function() {
      return (new this.constructor(this.geometry, this.material)).copy(this)
    }
  });
  var cg = new q,
    dg = new q;
  Z.prototype = Object.assign(Object.create(pa.prototype), {
    constructor: Z,
    isLineSegments: !0,
    computeLineDistances: function() {
      var a = this.geometry;
      if (a.isBufferGeometry)
        if (null === a.index) {
          for (var b = a.attributes.position, c = [], d = 0, f = b.count; d < f; d += 2) cg.fromBufferAttribute(b, d), dg.fromBufferAttribute(b, d + 1), c[d] = 0 === d ? 0 : c[d - 1], c[d + 1] = c[d] + cg.distanceTo(dg);
          a.setAttribute("lineDistance", new F(c, 1))
        } else console.warn("THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");
      else if (a.isGeometry)
        for (b = a.vertices, c = a.lineDistances,
          d = 0, f = b.length; d < f; d += 2) cg.copy(b[d]), dg.copy(b[d + 1]), c[d] = 0 === d ? 0 : c[d - 1], c[d + 1] = c[d] + cg.distanceTo(dg);
      return this
    }
  });
  hf.prototype = Object.assign(Object.create(pa.prototype), {
    constructor: hf,
    isLineLoop: !0
  });
  Va.prototype = Object.create(R.prototype);
  Va.prototype.constructor = Va;
  Va.prototype.isPointsMaterial = !0;
  Va.prototype.copy = function(a) {
    R.prototype.copy.call(this, a);
    this.color.copy(a.color);
    this.map = a.map;
    this.alphaMap = a.alphaMap;
    this.size = a.size;
    this.sizeAttenuation = a.sizeAttenuation;
    this.morphTargets =
      a.morphTargets;
    return this
  };
  var xj = new I,
    Kg = new ac,
    Te = new ub,
    eg = new q;
  Yc.prototype = Object.assign(Object.create(E.prototype), {
    constructor: Yc,
    isPoints: !0,
    raycast: function(a, b) {
      var c = this.geometry,
        d = this.matrixWorld,
        f = a.params.Points.threshold;
      null === c.boundingSphere && c.computeBoundingSphere();
      Te.copy(c.boundingSphere);
      Te.applyMatrix4(d);
      Te.radius += f;
      if (!1 !== a.ray.intersectsSphere(Te))
        if (xj.getInverse(d), Kg.copy(a.ray).applyMatrix4(xj), f /= (this.scale.x + this.scale.y + this.scale.z) / 3, f *= f, c.isBufferGeometry) {
          var g =
            c.index;
          c = c.attributes.position.array;
          if (null !== g) {
            var k = g.array;
            g = 0;
            for (var m = k.length; g < m; g++) {
              var l = k[g];
              eg.fromArray(c, 3 * l);
              Jg(eg, l, f, d, a, b, this)
            }
          } else
            for (g = 0, k = c.length / 3; g < k; g++) eg.fromArray(c, 3 * g), Jg(eg, g, f, d, a, b, this)
        } else
          for (c = c.vertices, g = 0, k = c.length; g < k; g++) Jg(c[g], g, f, d, a, b, this)
    },
    updateMorphTargets: function() {
      var a = this.geometry;
      if (a.isBufferGeometry) {
        a = a.morphAttributes;
        var b = Object.keys(a);
        if (0 < b.length) {
          var c = a[b[0]];
          if (void 0 !== c)
            for (this.morphTargetInfluences = [], this.morphTargetDictionary = {}, a = 0, b = c.length; a < b; a++) {
              var d = c[a].name || String(a);
              this.morphTargetInfluences.push(0);
              this.morphTargetDictionary[d] = a
            }
        }
      } else a = a.morphTargets, void 0 !== a && 0 < a.length && console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")
    },
    clone: function() {
      return (new this.constructor(this.geometry, this.material)).copy(this)
    }
  });
  Lg.prototype = Object.assign(Object.create(S.prototype), {
    constructor: Lg,
    isVideoTexture: !0,
    update: function() {
      var a = this.image;
      a.readyState >=
        a.HAVE_CURRENT_DATA && (this.needsUpdate = !0)
    }
  });
  Zc.prototype = Object.create(S.prototype);
  Zc.prototype.constructor = Zc;
  Zc.prototype.isCompressedTexture = !0;
  de.prototype = Object.create(S.prototype);
  de.prototype.constructor = de;
  de.prototype.isCanvasTexture = !0;
  ee.prototype = Object.create(S.prototype);
  ee.prototype.constructor = ee;
  ee.prototype.isDepthTexture = !0;
  $c.prototype = Object.create(G.prototype);
  $c.prototype.constructor = $c;
  fe.prototype = Object.create(P.prototype);
  fe.prototype.constructor = fe;
  ad.prototype = Object.create(G.prototype);
  ad.prototype.constructor = ad;
  ge.prototype = Object.create(P.prototype);
  ge.prototype.constructor = ge;
  Fa.prototype = Object.create(G.prototype);
  Fa.prototype.constructor = Fa;
  he.prototype = Object.create(P.prototype);
  he.prototype.constructor = he;
  bd.prototype = Object.create(Fa.prototype);
  bd.prototype.constructor = bd;
  ie.prototype = Object.create(P.prototype);
  ie.prototype.constructor = ie;
  lc.prototype = Object.create(Fa.prototype);
  lc.prototype.constructor = lc;
  je.prototype = Object.create(P.prototype);
  je.prototype.constructor =
    je;
  cd.prototype = Object.create(Fa.prototype);
  cd.prototype.constructor = cd;
  ke.prototype = Object.create(P.prototype);
  ke.prototype.constructor = ke;
  dd.prototype = Object.create(Fa.prototype);
  dd.prototype.constructor = dd;
  le.prototype = Object.create(P.prototype);
  le.prototype.constructor = le;
  mc.prototype = Object.create(G.prototype);
  mc.prototype.constructor = mc;
  mc.prototype.toJSON = function() {
    var a = G.prototype.toJSON.call(this);
    a.path = this.parameters.path.toJSON();
    return a
  };
  me.prototype = Object.create(P.prototype);
  me.prototype.constructor =
    me;
  ed.prototype = Object.create(G.prototype);
  ed.prototype.constructor = ed;
  ne.prototype = Object.create(P.prototype);
  ne.prototype.constructor = ne;
  fd.prototype = Object.create(G.prototype);
  fd.prototype.constructor = fd;
  var Ml = {
      triangulate: function(a, b, c) {
        c = c || 2;
        var d = b && b.length,
          f = d ? b[0] * c : a.length,
          g = Di(a, 0, f, c, !0),
          k = [];
        if (!g || g.next === g.prev) return k;
        var m;
        if (d) {
          var l = c;
          d = [];
          var p;
          var q = 0;
          for (p = b.length; q < p; q++) {
            var t = b[q] * l;
            var r = q < p - 1 ? b[q + 1] * l : a.length;
            t = Di(a, t, r, l, !1);
            t === t.next && (t.steiner = !0);
            d.push(ll(t))
          }
          d.sort(jl);
          for (q = 0; q < d.length; q++) {
            b = d[q];
            l = g;
            if (l = kl(b, l)) b = Gi(l, b), pe(b, b.next);
            g = pe(g, g.next)
          }
        }
        if (a.length > 80 * c) {
          var u = m = a[0];
          var v = d = a[1];
          for (l = c; l < f; l += c) q = a[l], b = a[l + 1], q < u && (u = q), b < v && (v = b), q > m && (m = q), b > d && (d = b);
          m = Math.max(m - u, d - v);
          m = 0 !== m ? 1 / m : 0
        }
        qe(g, k, c, u, v, m);
        return k
      }
    },
    xb = {
      area: function(a) {
        for (var b = a.length, c = 0, d = b - 1, f = 0; f < b; d = f++) c += a[d].x * a[f].y - a[f].x * a[d].y;
        return .5 * c
      },
      isClockWise: function(a) {
        return 0 > xb.area(a)
      },
      triangulateShape: function(a, b) {
        var c = [],
          d = [],
          f = [];
        Hi(a);
        Ii(c, a);
        var g = a.length;
        b.forEach(Hi);
        for (a = 0; a < b.length; a++) d.push(g), g += b[a].length, Ii(c, b[a]);
        b = Ml.triangulate(c, d);
        for (a = 0; a < b.length; a += 3) f.push(b.slice(a, a + 3));
        return f
      }
    };
  oc.prototype = Object.create(P.prototype);
  oc.prototype.constructor = oc;
  oc.prototype.toJSON = function() {
    var a = P.prototype.toJSON.call(this);
    return Ji(this.parameters.shapes, this.parameters.options, a)
  };
  jb.prototype = Object.create(G.prototype);
  jb.prototype.constructor = jb;
  jb.prototype.toJSON = function() {
    var a = G.prototype.toJSON.call(this);
    return Ji(this.parameters.shapes,
      this.parameters.options, a)
  };
  var ml = {
    generateTopUV: function(a, b, c, d, f) {
      a = b[3 * d];
      d = b[3 * d + 1];
      var g = b[3 * f];
      f = b[3 * f + 1];
      return [new z(b[3 * c], b[3 * c + 1]), new z(a, d), new z(g, f)]
    },
    generateSideWallUV: function(a, b, c, d, f, g) {
      a = b[3 * c];
      var k = b[3 * c + 1];
      c = b[3 * c + 2];
      var m = b[3 * d],
        l = b[3 * d + 1];
      d = b[3 * d + 2];
      var p = b[3 * f],
        q = b[3 * f + 1];
      f = b[3 * f + 2];
      var t = b[3 * g],
        r = b[3 * g + 1];
      b = b[3 * g + 2];
      return .01 > Math.abs(k - l) ? [new z(a, 1 - c), new z(m, 1 - d), new z(p, 1 - f), new z(t, 1 - b)] : [new z(k, 1 - c), new z(l, 1 - d), new z(q, 1 - f), new z(r, 1 - b)]
    }
  };
  se.prototype = Object.create(P.prototype);
  se.prototype.constructor = se;
  hd.prototype = Object.create(jb.prototype);
  hd.prototype.constructor = hd;
  te.prototype = Object.create(P.prototype);
  te.prototype.constructor = te;
  Ob.prototype = Object.create(G.prototype);
  Ob.prototype.constructor = Ob;
  ue.prototype = Object.create(P.prototype);
  ue.prototype.constructor = ue;
  id.prototype = Object.create(G.prototype);
  id.prototype.constructor = id;
  ve.prototype = Object.create(P.prototype);
  ve.prototype.constructor = ve;
  jd.prototype = Object.create(G.prototype);
  jd.prototype.constructor =
    jd;
  pc.prototype = Object.create(P.prototype);
  pc.prototype.constructor = pc;
  pc.prototype.toJSON = function() {
    var a = P.prototype.toJSON.call(this);
    return Ki(this.parameters.shapes, a)
  };
  qc.prototype = Object.create(G.prototype);
  qc.prototype.constructor = qc;
  qc.prototype.toJSON = function() {
    var a = G.prototype.toJSON.call(this);
    return Ki(this.parameters.shapes, a)
  };
  kd.prototype = Object.create(G.prototype);
  kd.prototype.constructor = kd;
  rc.prototype = Object.create(P.prototype);
  rc.prototype.constructor = rc;
  yb.prototype = Object.create(G.prototype);
  yb.prototype.constructor = yb;
  we.prototype = Object.create(rc.prototype);
  we.prototype.constructor = we;
  xe.prototype = Object.create(yb.prototype);
  xe.prototype.constructor = xe;
  ye.prototype = Object.create(P.prototype);
  ye.prototype.constructor = ye;
  ld.prototype = Object.create(G.prototype);
  ld.prototype.constructor = ld;
  var Ba = Object.freeze({
    __proto__: null,
    WireframeGeometry: $c,
    ParametricGeometry: fe,
    ParametricBufferGeometry: ad,
    TetrahedronGeometry: he,
    TetrahedronBufferGeometry: bd,
    OctahedronGeometry: ie,
    OctahedronBufferGeometry: lc,
    IcosahedronGeometry: je,
    IcosahedronBufferGeometry: cd,
    DodecahedronGeometry: ke,
    DodecahedronBufferGeometry: dd,
    PolyhedronGeometry: ge,
    PolyhedronBufferGeometry: Fa,
    TubeGeometry: le,
    TubeBufferGeometry: mc,
    TorusKnotGeometry: me,
    TorusKnotBufferGeometry: ed,
    TorusGeometry: ne,
    TorusBufferGeometry: fd,
    TextGeometry: se,
    TextBufferGeometry: hd,
    SphereGeometry: te,
    SphereBufferGeometry: Ob,
    RingGeometry: ue,
    RingBufferGeometry: id,
    PlaneGeometry: Td,
    PlaneBufferGeometry: ic,
    LatheGeometry: ve,
    LatheBufferGeometry: jd,
    ShapeGeometry: pc,
    ShapeBufferGeometry: qc,
    ExtrudeGeometry: oc,
    ExtrudeBufferGeometry: jb,
    EdgesGeometry: kd,
    ConeGeometry: we,
    ConeBufferGeometry: xe,
    CylinderGeometry: rc,
    CylinderBufferGeometry: yb,
    CircleGeometry: ye,
    CircleBufferGeometry: ld,
    BoxGeometry: Eh,
    BoxBufferGeometry: Ud
  });
  sc.prototype = Object.create(R.prototype);
  sc.prototype.constructor = sc;
  sc.prototype.isShadowMaterial = !0;
  sc.prototype.copy = function(a) {
    R.prototype.copy.call(this, a);
    this.color.copy(a.color);
    return this
  };
  md.prototype = Object.create(Aa.prototype);
  md.prototype.constructor = md;
  md.prototype.isRawShaderMaterial = !0;
  kb.prototype = Object.create(R.prototype);
  kb.prototype.constructor = kb;
  kb.prototype.isMeshStandardMaterial = !0;
  kb.prototype.copy = function(a) {
    R.prototype.copy.call(this, a);
    this.defines = {
      STANDARD: ""
    };
    this.color.copy(a.color);
    this.roughness = a.roughness;
    this.metalness = a.metalness;
    this.map = a.map;
    this.lightMap = a.lightMap;
    this.lightMapIntensity = a.lightMapIntensity;
    this.aoMap = a.aoMap;
    this.aoMapIntensity = a.aoMapIntensity;
    this.emissive.copy(a.emissive);
    this.emissiveMap = a.emissiveMap;
    this.emissiveIntensity = a.emissiveIntensity;
    this.bumpMap = a.bumpMap;
    this.bumpScale = a.bumpScale;
    this.normalMap = a.normalMap;
    this.normalMapType = a.normalMapType;
    this.normalScale.copy(a.normalScale);
    this.displacementMap = a.displacementMap;
    this.displacementScale = a.displacementScale;
    this.displacementBias = a.displacementBias;
    this.roughnessMap = a.roughnessMap;
    this.metalnessMap = a.metalnessMap;
    this.alphaMap = a.alphaMap;
    this.envMap = a.envMap;
    this.envMapIntensity = a.envMapIntensity;
    this.refractionRatio = a.refractionRatio;
    this.wireframe = a.wireframe;
    this.wireframeLinewidth =
      a.wireframeLinewidth;
    this.wireframeLinecap = a.wireframeLinecap;
    this.wireframeLinejoin = a.wireframeLinejoin;
    this.skinning = a.skinning;
    this.morphTargets = a.morphTargets;
    this.morphNormals = a.morphNormals;
    return this
  };
  tc.prototype = Object.create(kb.prototype);
  tc.prototype.constructor = tc;
  tc.prototype.isMeshPhysicalMaterial = !0;
  tc.prototype.copy = function(a) {
    kb.prototype.copy.call(this, a);
    this.defines = {
      STANDARD: "",
      PHYSICAL: ""
    };
    this.reflectivity = a.reflectivity;
    this.clearcoat = a.clearcoat;
    this.clearcoatRoughness =
      a.clearcoatRoughness;
    this.sheen = a.sheen ? (this.sheen || new D).copy(a.sheen) : null;
    this.clearcoatNormalMap = a.clearcoatNormalMap;
    this.clearcoatNormalScale.copy(a.clearcoatNormalScale);
    this.transparency = a.transparency;
    return this
  };
  Wa.prototype = Object.create(R.prototype);
  Wa.prototype.constructor = Wa;
  Wa.prototype.isMeshPhongMaterial = !0;
  Wa.prototype.copy = function(a) {
    R.prototype.copy.call(this, a);
    this.color.copy(a.color);
    this.specular.copy(a.specular);
    this.shininess = a.shininess;
    this.map = a.map;
    this.lightMap =
      a.lightMap;
    this.lightMapIntensity = a.lightMapIntensity;
    this.aoMap = a.aoMap;
    this.aoMapIntensity = a.aoMapIntensity;
    this.emissive.copy(a.emissive);
    this.emissiveMap = a.emissiveMap;
    this.emissiveIntensity = a.emissiveIntensity;
    this.bumpMap = a.bumpMap;
    this.bumpScale = a.bumpScale;
    this.normalMap = a.normalMap;
    this.normalMapType = a.normalMapType;
    this.normalScale.copy(a.normalScale);
    this.displacementMap = a.displacementMap;
    this.displacementScale = a.displacementScale;
    this.displacementBias = a.displacementBias;
    this.specularMap =
      a.specularMap;
    this.alphaMap = a.alphaMap;
    this.envMap = a.envMap;
    this.combine = a.combine;
    this.reflectivity = a.reflectivity;
    this.refractionRatio = a.refractionRatio;
    this.wireframe = a.wireframe;
    this.wireframeLinewidth = a.wireframeLinewidth;
    this.wireframeLinecap = a.wireframeLinecap;
    this.wireframeLinejoin = a.wireframeLinejoin;
    this.skinning = a.skinning;
    this.morphTargets = a.morphTargets;
    this.morphNormals = a.morphNormals;
    return this
  };
  uc.prototype = Object.create(Wa.prototype);
  uc.prototype.constructor = uc;
  uc.prototype.isMeshToonMaterial = !0;
  uc.prototype.copy = function(a) {
    Wa.prototype.copy.call(this, a);
    this.gradientMap = a.gradientMap;
    return this
  };
  vc.prototype = Object.create(R.prototype);
  vc.prototype.constructor = vc;
  vc.prototype.isMeshNormalMaterial = !0;
  vc.prototype.copy = function(a) {
    R.prototype.copy.call(this, a);
    this.bumpMap = a.bumpMap;
    this.bumpScale = a.bumpScale;
    this.normalMap = a.normalMap;
    this.normalMapType = a.normalMapType;
    this.normalScale.copy(a.normalScale);
    this.displacementMap = a.displacementMap;
    this.displacementScale = a.displacementScale;
    this.displacementBias = a.displacementBias;
    this.wireframe = a.wireframe;
    this.wireframeLinewidth = a.wireframeLinewidth;
    this.skinning = a.skinning;
    this.morphTargets = a.morphTargets;
    this.morphNormals = a.morphNormals;
    return this
  };
  wc.prototype = Object.create(R.prototype);
  wc.prototype.constructor = wc;
  wc.prototype.isMeshLambertMaterial = !0;
  wc.prototype.copy = function(a) {
    R.prototype.copy.call(this, a);
    this.color.copy(a.color);
    this.map = a.map;
    this.lightMap = a.lightMap;
    this.lightMapIntensity = a.lightMapIntensity;
    this.aoMap =
      a.aoMap;
    this.aoMapIntensity = a.aoMapIntensity;
    this.emissive.copy(a.emissive);
    this.emissiveMap = a.emissiveMap;
    this.emissiveIntensity = a.emissiveIntensity;
    this.specularMap = a.specularMap;
    this.alphaMap = a.alphaMap;
    this.envMap = a.envMap;
    this.combine = a.combine;
    this.reflectivity = a.reflectivity;
    this.refractionRatio = a.refractionRatio;
    this.wireframe = a.wireframe;
    this.wireframeLinewidth = a.wireframeLinewidth;
    this.wireframeLinecap = a.wireframeLinecap;
    this.wireframeLinejoin = a.wireframeLinejoin;
    this.skinning = a.skinning;
    this.morphTargets = a.morphTargets;
    this.morphNormals = a.morphNormals;
    return this
  };
  xc.prototype = Object.create(R.prototype);
  xc.prototype.constructor = xc;
  xc.prototype.isMeshMatcapMaterial = !0;
  xc.prototype.copy = function(a) {
    R.prototype.copy.call(this, a);
    this.defines = {
      MATCAP: ""
    };
    this.color.copy(a.color);
    this.matcap = a.matcap;
    this.map = a.map;
    this.bumpMap = a.bumpMap;
    this.bumpScale = a.bumpScale;
    this.normalMap = a.normalMap;
    this.normalMapType = a.normalMapType;
    this.normalScale.copy(a.normalScale);
    this.displacementMap = a.displacementMap;
    this.displacementScale = a.displacementScale;
    this.displacementBias = a.displacementBias;
    this.alphaMap = a.alphaMap;
    this.skinning = a.skinning;
    this.morphTargets = a.morphTargets;
    this.morphNormals = a.morphNormals;
    return this
  };
  yc.prototype = Object.create(T.prototype);
  yc.prototype.constructor = yc;
  yc.prototype.isLineDashedMaterial = !0;
  yc.prototype.copy = function(a) {
    T.prototype.copy.call(this, a);
    this.scale = a.scale;
    this.dashSize = a.dashSize;
    this.gapSize = a.gapSize;
    return this
  };
  var Nl = Object.freeze({
      __proto__: null,
      ShadowMaterial: sc,
      SpriteMaterial: Nb,
      RawShaderMaterial: md,
      ShaderMaterial: Aa,
      PointsMaterial: Va,
      MeshPhysicalMaterial: tc,
      MeshStandardMaterial: kb,
      MeshPhongMaterial: Wa,
      MeshToonMaterial: uc,
      MeshNormalMaterial: vc,
      MeshLambertMaterial: wc,
      MeshDepthMaterial: Kb,
      MeshDistanceMaterial: Lb,
      MeshBasicMaterial: Ia,
      MeshMatcapMaterial: xc,
      LineDashedMaterial: yc,
      LineBasicMaterial: T,
      Material: R
    }),
    aa = {
      arraySlice: function(a, b, c) {
        return aa.isTypedArray(a) ? new a.constructor(a.subarray(b, void 0 !== c ? c : a.length)) : a.slice(b, c)
      },
      convertArray: function(a,
        b, c) {
        return !a || !c && a.constructor === b ? a : "number" === typeof b.BYTES_PER_ELEMENT ? new b(a) : Array.prototype.slice.call(a)
      },
      isTypedArray: function(a) {
        return ArrayBuffer.isView(a) && !(a instanceof DataView)
      },
      getKeyframeOrder: function(a) {
        for (var b = a.length, c = Array(b), d = 0; d !== b; ++d) c[d] = d;
        c.sort(function(b, c) {
          return a[b] - a[c]
        });
        return c
      },
      sortedArray: function(a, b, c) {
        for (var d = a.length, f = new a.constructor(d), g = 0, k = 0; k !== d; ++g)
          for (var m = c[g] * b, l = 0; l !== b; ++l) f[k++] = a[m + l];
        return f
      },
      flattenJSON: function(a, b, c, d) {
        for (var f =
            1, g = a[0]; void 0 !== g && void 0 === g[d];) g = a[f++];
        if (void 0 !== g) {
          var k = g[d];
          if (void 0 !== k)
            if (Array.isArray(k)) {
              do k = g[d], void 0 !== k && (b.push(g.time), c.push.apply(c, k)), g = a[f++]; while (void 0 !== g)
            } else if (void 0 !== k.toArray) {
            do k = g[d], void 0 !== k && (b.push(g.time), k.toArray(c, c.length)), g = a[f++]; while (void 0 !== g)
          } else {
            do k = g[d], void 0 !== k && (b.push(g.time), c.push(k)), g = a[f++]; while (void 0 !== g)
          }
        }
      },
      subclip: function(a, b, c, d, f) {
        f = f || 30;
        a = a.clone();
        a.name = b;
        var g = [];
        for (b = 0; b < a.tracks.length; ++b) {
          for (var k = a.tracks[b],
              m = k.getValueSize(), l = [], p = [], q = 0; q < k.times.length; ++q) {
            var t = k.times[q] * f;
            if (!(t < c || t >= d))
              for (l.push(k.times[q]), t = 0; t < m; ++t) p.push(k.values[q * m + t])
          }
          0 !== l.length && (k.times = aa.convertArray(l, k.times.constructor), k.values = aa.convertArray(p, k.values.constructor), g.push(k))
        }
        a.tracks = g;
        c = Infinity;
        for (b = 0; b < a.tracks.length; ++b) c > a.tracks[b].times[0] && (c = a.tracks[b].times[0]);
        for (b = 0; b < a.tracks.length; ++b) a.tracks[b].shift(-1 * c);
        a.resetDuration();
        return a
      }
    };
  Object.assign(La.prototype, {
    evaluate: function(a) {
      var b =
        this.parameterPositions,
        c = this._cachedIndex,
        d = b[c],
        f = b[c - 1];
      a: {
        b: {
          c: {
            d: if (!(a < d)) {
              for (var g = c + 2;;) {
                if (void 0 === d) {
                  if (a < f) break d;
                  this._cachedIndex = c = b.length;
                  return this.afterEnd_(c - 1, a, f)
                }
                if (c === g) break;
                f = d;
                d = b[++c];
                if (a < d) break b
              }
              d = b.length;
              break c
            }if (a >= f) break a;
            else {
              g = b[1];
              a < g && (c = 2, f = g);
              for (g = c - 2;;) {
                if (void 0 === f) return this._cachedIndex = 0, this.beforeStart_(0, a, d);
                if (c === g) break;
                d = f;
                f = b[--c - 1];
                if (a >= f) break b
              }
              d = c;
              c = 0
            }
          }
          for (; c < d;) f = c + d >>> 1,
          a < b[f] ? d = f : c = f + 1;d = b[c];f = b[c - 1];
          if (void 0 === f) return this._cachedIndex =
            0, this.beforeStart_(0, a, d);
          if (void 0 === d) return this._cachedIndex = c = b.length, this.afterEnd_(c - 1, f, a)
        }
        this._cachedIndex = c;this.intervalChanged_(c, f, d)
      }
      return this.interpolate_(c, f, a, d)
    },
    settings: null,
    DefaultSettings_: {},
    getSettings_: function() {
      return this.settings || this.DefaultSettings_
    },
    copySampleValue_: function(a) {
      var b = this.resultBuffer,
        c = this.sampleValues,
        d = this.valueSize;
      a *= d;
      for (var f = 0; f !== d; ++f) b[f] = c[a + f];
      return b
    },
    interpolate_: function() {
      throw Error("call to abstract method");
    },
    intervalChanged_: function() {}
  });
  Object.assign(La.prototype, {
    beforeStart_: La.prototype.copySampleValue_,
    afterEnd_: La.prototype.copySampleValue_
  });
  jf.prototype = Object.assign(Object.create(La.prototype), {
    constructor: jf,
    DefaultSettings_: {
      endingStart: 2400,
      endingEnd: 2400
    },
    intervalChanged_: function(a, b, c) {
      var d = this.parameterPositions,
        f = a - 2,
        g = a + 1,
        k = d[f],
        m = d[g];
      if (void 0 === k) switch (this.getSettings_().endingStart) {
        case 2401:
          f = a;
          k = 2 * b - c;
          break;
        case 2402:
          f = d.length - 2;
          k = b + d[f] - d[f + 1];
          break;
        default:
          f = a, k = c
      }
      if (void 0 === m) switch (this.getSettings_().endingEnd) {
        case 2401:
          g =
            a;
          m = 2 * c - b;
          break;
        case 2402:
          g = 1;
          m = c + d[1] - d[0];
          break;
        default:
          g = a - 1, m = b
      }
      a = .5 * (c - b);
      d = this.valueSize;
      this._weightPrev = a / (b - k);
      this._weightNext = a / (m - c);
      this._offsetPrev = f * d;
      this._offsetNext = g * d
    },
    interpolate_: function(a, b, c, d) {
      var f = this.resultBuffer,
        g = this.sampleValues,
        k = this.valueSize;
      a *= k;
      var m = a - k,
        l = this._offsetPrev,
        p = this._offsetNext,
        q = this._weightPrev,
        t = this._weightNext,
        r = (c - b) / (d - b);
      c = r * r;
      d = c * r;
      b = -q * d + 2 * q * c - q * r;
      q = (1 + q) * d + (-1.5 - 2 * q) * c + (-.5 + q) * r + 1;
      r = (-1 - t) * d + (1.5 + t) * c + .5 * r;
      t = t * d - t * c;
      for (c = 0; c !== k; ++c) f[c] =
        b * g[l + c] + q * g[m + c] + r * g[a + c] + t * g[p + c];
      return f
    }
  });
  ze.prototype = Object.assign(Object.create(La.prototype), {
    constructor: ze,
    interpolate_: function(a, b, c, d) {
      var f = this.resultBuffer,
        g = this.sampleValues,
        k = this.valueSize;
      a *= k;
      var m = a - k;
      b = (c - b) / (d - b);
      c = 1 - b;
      for (d = 0; d !== k; ++d) f[d] = g[m + d] * c + g[a + d] * b;
      return f
    }
  });
  kf.prototype = Object.assign(Object.create(La.prototype), {
    constructor: kf,
    interpolate_: function(a) {
      return this.copySampleValue_(a - 1)
    }
  });
  Object.assign(ua, {
    toJSON: function(a) {
      var b = a.constructor;
      if (void 0 !==
        b.toJSON) b = b.toJSON(a);
      else {
        b = {
          name: a.name,
          times: aa.convertArray(a.times, Array),
          values: aa.convertArray(a.values, Array)
        };
        var c = a.getInterpolation();
        c !== a.DefaultInterpolation && (b.interpolation = c)
      }
      b.type = a.ValueTypeName;
      return b
    }
  });
  Object.assign(ua.prototype, {
    constructor: ua,
    TimeBufferType: Float32Array,
    ValueBufferType: Float32Array,
    DefaultInterpolation: 2301,
    InterpolantFactoryMethodDiscrete: function(a) {
      return new kf(this.times, this.values, this.getValueSize(), a)
    },
    InterpolantFactoryMethodLinear: function(a) {
      return new ze(this.times,
        this.values, this.getValueSize(), a)
    },
    InterpolantFactoryMethodSmooth: function(a) {
      return new jf(this.times, this.values, this.getValueSize(), a)
    },
    setInterpolation: function(a) {
      switch (a) {
        case 2300:
          var b = this.InterpolantFactoryMethodDiscrete;
          break;
        case 2301:
          b = this.InterpolantFactoryMethodLinear;
          break;
        case 2302:
          b = this.InterpolantFactoryMethodSmooth
      }
      if (void 0 === b) {
        b = "unsupported interpolation for " + this.ValueTypeName + " keyframe track named " + this.name;
        if (void 0 === this.createInterpolant)
          if (a !== this.DefaultInterpolation) this.setInterpolation(this.DefaultInterpolation);
          else throw Error(b);
        console.warn("THREE.KeyframeTrack:", b);
        return this
      }
      this.createInterpolant = b;
      return this
    },
    getInterpolation: function() {
      switch (this.createInterpolant) {
        case this.InterpolantFactoryMethodDiscrete:
          return 2300;
        case this.InterpolantFactoryMethodLinear:
          return 2301;
        case this.InterpolantFactoryMethodSmooth:
          return 2302
      }
    },
    getValueSize: function() {
      return this.values.length / this.times.length
    },
    shift: function(a) {
      if (0 !== a)
        for (var b = this.times, c = 0, d = b.length; c !== d; ++c) b[c] += a;
      return this
    },
    scale: function(a) {
      if (1 !==
        a)
        for (var b = this.times, c = 0, d = b.length; c !== d; ++c) b[c] *= a;
      return this
    },
    trim: function(a, b) {
      for (var c = this.times, d = c.length, f = 0, g = d - 1; f !== d && c[f] < a;) ++f;
      for (; - 1 !== g && c[g] > b;) --g;
      ++g;
      if (0 !== f || g !== d) f >= g && (g = Math.max(g, 1), f = g - 1), a = this.getValueSize(), this.times = aa.arraySlice(c, f, g), this.values = aa.arraySlice(this.values, f * a, g * a);
      return this
    },
    validate: function() {
      var a = !0,
        b = this.getValueSize();
      0 !== b - Math.floor(b) && (console.error("THREE.KeyframeTrack: Invalid value size in track.", this), a = !1);
      var c = this.times;
      b = this.values;
      var d = c.length;
      0 === d && (console.error("THREE.KeyframeTrack: Track is empty.", this), a = !1);
      for (var f = null, g = 0; g !== d; g++) {
        var k = c[g];
        if ("number" === typeof k && isNaN(k)) {
          console.error("THREE.KeyframeTrack: Time is not a valid number.", this, g, k);
          a = !1;
          break
        }
        if (null !== f && f > k) {
          console.error("THREE.KeyframeTrack: Out of order keys.", this, g, k, f);
          a = !1;
          break
        }
        f = k
      }
      if (void 0 !== b && aa.isTypedArray(b))
        for (g = 0, c = b.length; g !== c; ++g)
          if (d = b[g], isNaN(d)) {
            console.error("THREE.KeyframeTrack: Value is not a valid number.",
              this, g, d);
            a = !1;
            break
          }
      return a
    },
    optimize: function() {
      for (var a = this.times, b = this.values, c = this.getValueSize(), d = 2302 === this.getInterpolation(), f = 1, g = a.length - 1, k = 1; k < g; ++k) {
        var m = !1,
          l = a[k];
        if (l !== a[k + 1] && (1 !== k || l !== l[0]))
          if (d) m = !0;
          else {
            var p = k * c,
              q = p - c,
              t = p + c;
            for (l = 0; l !== c; ++l) {
              var r = b[p + l];
              if (r !== b[q + l] || r !== b[t + l]) {
                m = !0;
                break
              }
            }
          }
        if (m) {
          if (k !== f)
            for (a[f] = a[k], m = k * c, p = f * c, l = 0; l !== c; ++l) b[p + l] = b[m + l];
          ++f
        }
      }
      if (0 < g) {
        a[f] = a[g];
        m = g * c;
        p = f * c;
        for (l = 0; l !== c; ++l) b[p + l] = b[m + l];
        ++f
      }
      f !== a.length && (this.times = aa.arraySlice(a,
        0, f), this.values = aa.arraySlice(b, 0, f * c));
      return this
    },
    clone: function() {
      var a = aa.arraySlice(this.times, 0),
        b = aa.arraySlice(this.values, 0);
      a = new this.constructor(this.name, a, b);
      a.createInterpolant = this.createInterpolant;
      return a
    }
  });
  lf.prototype = Object.assign(Object.create(ua.prototype), {
    constructor: lf,
    ValueTypeName: "bool",
    ValueBufferType: Array,
    DefaultInterpolation: 2300,
    InterpolantFactoryMethodLinear: void 0,
    InterpolantFactoryMethodSmooth: void 0
  });
  mf.prototype = Object.assign(Object.create(ua.prototype), {
    constructor: mf,
    ValueTypeName: "color"
  });
  nd.prototype = Object.assign(Object.create(ua.prototype), {
    constructor: nd,
    ValueTypeName: "number"
  });
  nf.prototype = Object.assign(Object.create(La.prototype), {
    constructor: nf,
    interpolate_: function(a, b, c, d) {
      var f = this.resultBuffer,
        g = this.sampleValues,
        k = this.valueSize;
      a *= k;
      b = (c - b) / (d - b);
      for (c = a + k; a !== c; a += 4) ya.slerpFlat(f, 0, g, a - k, g, a, b);
      return f
    }
  });
  Ae.prototype = Object.assign(Object.create(ua.prototype), {
    constructor: Ae,
    ValueTypeName: "quaternion",
    DefaultInterpolation: 2301,
    InterpolantFactoryMethodLinear: function(a) {
      return new nf(this.times, this.values, this.getValueSize(), a)
    },
    InterpolantFactoryMethodSmooth: void 0
  }); of .prototype = Object.assign(Object.create(ua.prototype), {
    constructor: of ,
    ValueTypeName: "string",
    ValueBufferType: Array,
    DefaultInterpolation: 2300,
    InterpolantFactoryMethodLinear: void 0,
    InterpolantFactoryMethodSmooth: void 0
  });
  od.prototype = Object.assign(Object.create(ua.prototype), {
    constructor: od,
    ValueTypeName: "vector"
  });
  Object.assign(Pa, {
    parse: function(a) {
      for (var b = [], c = a.tracks, d = 1 / (a.fps || 1), f = 0, g = c.length; f !== g; ++f) b.push(ol(c[f]).scale(d));
      return new Pa(a.name, a.duration, b)
    },
    toJSON: function(a) {
      var b = [],
        c = a.tracks;
      a = {
        name: a.name,
        duration: a.duration,
        tracks: b,
        uuid: a.uuid
      };
      for (var d = 0, f = c.length; d !== f; ++d) b.push(ua.toJSON(c[d]));
      return a
    },
    CreateFromMorphTargetSequence: function(a, b, c, d) {
      for (var f = b.length, g = [], k = 0; k < f; k++) {
        var m = [],
          l = [];
        m.push((k + f - 1) % f, k, (k + 1) % f);
        l.push(0, 1, 0);
        var p = aa.getKeyframeOrder(m);
        m = aa.sortedArray(m, 1, p);
        l = aa.sortedArray(l, 1, p);
        d || 0 !==
          m[0] || (m.push(f), l.push(l[0]));
        g.push((new nd(".morphTargetInfluences[" + b[k].name + "]", m, l)).scale(1 / c))
      }
      return new Pa(a, -1, g)
    },
    findByName: function(a, b) {
      var c = a;
      Array.isArray(a) || (c = a.geometry && a.geometry.animations || a.animations);
      for (a = 0; a < c.length; a++)
        if (c[a].name === b) return c[a];
      return null
    },
    CreateClipsFromMorphTargetSequences: function(a, b, c) {
      for (var d = {}, f = /^([\w-]*?)([\d]+)$/, g = 0, k = a.length; g < k; g++) {
        var m = a[g],
          l = m.name.match(f);
        if (l && 1 < l.length) {
          var p = l[1];
          (l = d[p]) || (d[p] = l = []);
          l.push(m)
        }
      }
      a = [];
      for (p in d) a.push(Pa.CreateFromMorphTargetSequence(p, d[p], b, c));
      return a
    },
    parseAnimation: function(a, b) {
      if (!a) return console.error("THREE.AnimationClip: No animation in JSONLoader data."), null;
      var c = function(a, b, c, d, f) {
          if (0 !== c.length) {
            var g = [],
              k = [];
            aa.flattenJSON(c, g, k, d);
            0 !== g.length && f.push(new a(b, g, k))
          }
        },
        d = [],
        f = a.name || "default",
        g = a.length || -1,
        k = a.fps || 30;
      a = a.hierarchy || [];
      for (var m = 0; m < a.length; m++) {
        var l = a[m].keys;
        if (l && 0 !== l.length)
          if (l[0].morphTargets) {
            g = {};
            for (var p = 0; p < l.length; p++)
              if (l[p].morphTargets)
                for (var q =
                    0; q < l[p].morphTargets.length; q++) g[l[p].morphTargets[q]] = -1;
            for (var t in g) {
              var r = [],
                u = [];
              for (q = 0; q !== l[p].morphTargets.length; ++q) {
                var v = l[p];
                r.push(v.time);
                u.push(v.morphTarget === t ? 1 : 0)
              }
              d.push(new nd(".morphTargetInfluence[" + t + "]", r, u))
            }
            g = g.length * (k || 1)
          } else p = ".bones[" + b[m].name + "]", c(od, p + ".position", l, "pos", d), c(Ae, p + ".quaternion", l, "rot", d), c(od, p + ".scale", l, "scl", d)
      }
      return 0 === d.length ? null : new Pa(f, g, d)
    }
  });
  Object.assign(Pa.prototype, {
    resetDuration: function() {
      for (var a = 0, b = 0, c = this.tracks.length; b !==
        c; ++b) {
        var d = this.tracks[b];
        a = Math.max(a, d.times[d.times.length - 1])
      }
      this.duration = a;
      return this
    },
    trim: function() {
      for (var a = 0; a < this.tracks.length; a++) this.tracks[a].trim(0, this.duration);
      return this
    },
    validate: function() {
      for (var a = !0, b = 0; b < this.tracks.length; b++) a = a && this.tracks[b].validate();
      return a
    },
    optimize: function() {
      for (var a = 0; a < this.tracks.length; a++) this.tracks[a].optimize();
      return this
    },
    clone: function() {
      for (var a = [], b = 0; b < this.tracks.length; b++) a.push(this.tracks[b].clone());
      return new Pa(this.name,
        this.duration, a)
    }
  });
  var Fc = {
      enabled: !1,
      files: {},
      add: function(a, b) {
        !1 !== this.enabled && (this.files[a] = b)
      },
      get: function(a) {
        if (!1 !== this.enabled) return this.files[a]
      },
      remove: function(a) {
        delete this.files[a]
      },
      clear: function() {
        this.files = {}
      }
    },
    Li = new Og;
  Object.assign(X.prototype, {
    load: function() {},
    parse: function() {},
    setCrossOrigin: function(a) {
      this.crossOrigin = a;
      return this
    },
    setPath: function(a) {
      this.path = a;
      return this
    },
    setResourcePath: function(a) {
      this.resourcePath = a;
      return this
    }
  });
  var eb = {};
  Qa.prototype =
    Object.assign(Object.create(X.prototype), {
      constructor: Qa,
      load: function(a, b, c, d) {
        void 0 === a && (a = "");
        void 0 !== this.path && (a = this.path + a);
        a = this.manager.resolveURL(a);
        var f = this,
          g = Fc.get(a);
        if (void 0 !== g) return f.manager.itemStart(a), setTimeout(function() {
          b && b(g);
          f.manager.itemEnd(a)
        }, 0), g;
        if (void 0 !== eb[a]) eb[a].push({
          onLoad: b,
          onProgress: c,
          onError: d
        });
        else {
          var k = a.match(/^data:(.*?)(;base64)?,(.*)$/);
          if (k) {
            c = k[1];
            var m = !!k[2];
            k = k[3];
            k = decodeURIComponent(k);
            m && (k = atob(k));
            try {
              var l = (this.responseType ||
                "").toLowerCase();
              switch (l) {
                case "arraybuffer":
                case "blob":
                  var p = new Uint8Array(k.length);
                  for (m = 0; m < k.length; m++) p[m] = k.charCodeAt(m);
                  var q = "blob" === l ? new Blob([p.buffer], {
                    type: c
                  }) : p.buffer;
                  break;
                case "document":
                  q = (new DOMParser).parseFromString(k, c);
                  break;
                case "json":
                  q = JSON.parse(k);
                  break;
                default:
                  q = k
              }
              setTimeout(function() {
                b && b(q);
                f.manager.itemEnd(a)
              }, 0)
            } catch (r) {
              setTimeout(function() {
                d && d(r);
                f.manager.itemError(a);
                f.manager.itemEnd(a)
              }, 0)
            }
          } else {
            eb[a] = [];
            eb[a].push({
              onLoad: b,
              onProgress: c,
              onError: d
            });
            var t = new Ac;
            t.open("GET", a, !0);
            t.addEventListener("load", function(b) {
              var c = this.response,
                d = eb[a];
              delete eb[a];
              if (200 === this.status || 0 === this.status) {
                0 === this.status && console.warn("THREE.FileLoader: HTTP Status 0 received.");
                Fc.add(a, c);
                for (var g = 0, k = d.length; g < k; g++) {
                  var m = d[g];
                  if (m.onLoad) m.onLoad(c)
                }
              } else {
                g = 0;
                for (k = d.length; g < k; g++)
                  if (m = d[g], m.onError) m.onError(b);
                f.manager.itemError(a)
              }
              f.manager.itemEnd(a)
            }, !1);
            t.addEventListener("progress", function(b) {
              for (var c = eb[a], d = 0, f = c.length; d < f; d++) {
                var g =
                  c[d];
                if (g.onProgress) g.onProgress(b)
              }
            }, !1);
            t.addEventListener("error", function(b) {
              var c = eb[a];
              delete eb[a];
              for (var d = 0, g = c.length; d < g; d++) {
                var k = c[d];
                if (k.onError) k.onError(b)
              }
              f.manager.itemError(a);
              f.manager.itemEnd(a)
            }, !1);
            t.addEventListener("abort", function(b) {
              var c = eb[a];
              delete eb[a];
              for (var d = 0, g = c.length; d < g; d++) {
                var k = c[d];
                if (k.onError) k.onError(b)
              }
              f.manager.itemError(a);
              f.manager.itemEnd(a)
            }, !1);
            void 0 !== this.responseType && (t.responseType = this.responseType);
            void 0 !== this.withCredentials &&
              (t.withCredentials = this.withCredentials);
            t.overrideMimeType && t.overrideMimeType(void 0 !== this.mimeType ? this.mimeType : "text/plain");
            for (m in this.requestHeader) t.setRequestHeader(m, this.requestHeader[m]);
            t.send(null)
          }
          f.manager.itemStart(a);
          return t
        }
      },
      setResponseType: function(a) {
        this.responseType = a;
        return this
      },
      setWithCredentials: function(a) {
        this.withCredentials = a;
        return this
      },
      setMimeType: function(a) {
        this.mimeType = a;
        return this
      },
      setRequestHeader: function(a) {
        this.requestHeader = a;
        return this
      }
    });
  Pg.prototype =
    Object.assign(Object.create(X.prototype), {
      constructor: Pg,
      load: function(a, b, c, d) {
        var f = this,
          g = new Qa(f.manager);
        g.setPath(f.path);
        g.load(a, function(a) {
          b(f.parse(JSON.parse(a)))
        }, c, d)
      },
      parse: function(a) {
        for (var b = [], c = 0; c < a.length; c++) {
          var d = Pa.parse(a[c]);
          b.push(d)
        }
        return b
      }
    });
  Qg.prototype = Object.assign(Object.create(X.prototype), {
    constructor: Qg,
    load: function(a, b, c, d) {
      function f(f) {
        l.load(a[f], function(a) {
          a = g.parse(a, !0);
          k[f] = {
            width: a.width,
            height: a.height,
            format: a.format,
            mipmaps: a.mipmaps
          };
          p += 1;
          6 ===
            p && (1 === a.mipmapCount && (m.minFilter = 1006), m.format = a.format, m.needsUpdate = !0, b && b(m))
        }, c, d)
      }
      var g = this,
        k = [],
        m = new Zc;
      m.image = k;
      var l = new Qa(this.manager);
      l.setPath(this.path);
      l.setResponseType("arraybuffer");
      if (Array.isArray(a))
        for (var p = 0, q = 0, t = a.length; q < t; ++q) f(q);
      else l.load(a, function(a) {
        a = g.parse(a, !0);
        if (a.isCubemap)
          for (var c = a.mipmaps.length / a.mipmapCount, d = 0; d < c; d++) {
            k[d] = {
              mipmaps: []
            };
            for (var f = 0; f < a.mipmapCount; f++) k[d].mipmaps.push(a.mipmaps[d * a.mipmapCount + f]), k[d].format = a.format, k[d].width =
              a.width, k[d].height = a.height
          } else m.image.width = a.width, m.image.height = a.height, m.mipmaps = a.mipmaps;
        1 === a.mipmapCount && (m.minFilter = 1006);
        m.format = a.format;
        m.needsUpdate = !0;
        b && b(m)
      }, c, d);
      return m
    }
  });
  pf.prototype = Object.assign(Object.create(X.prototype), {
    constructor: pf,
    load: function(a, b, c, d) {
      var f = this,
        g = new hc,
        k = new Qa(this.manager);
      k.setResponseType("arraybuffer");
      k.setPath(this.path);
      k.load(a, function(a) {
        if (a = f.parse(a)) void 0 !== a.image ? g.image = a.image : void 0 !== a.data && (g.image.width = a.width, g.image.height =
          a.height, g.image.data = a.data), g.wrapS = void 0 !== a.wrapS ? a.wrapS : 1001, g.wrapT = void 0 !== a.wrapT ? a.wrapT : 1001, g.magFilter = void 0 !== a.magFilter ? a.magFilter : 1006, g.minFilter = void 0 !== a.minFilter ? a.minFilter : 1006, g.anisotropy = void 0 !== a.anisotropy ? a.anisotropy : 1, void 0 !== a.format && (g.format = a.format), void 0 !== a.type && (g.type = a.type), void 0 !== a.mipmaps && (g.mipmaps = a.mipmaps, g.minFilter = 1008), 1 === a.mipmapCount && (g.minFilter = 1006), g.needsUpdate = !0, b && b(g, a)
      }, c, d);
      return g
    }
  });
  pd.prototype = Object.assign(Object.create(X.prototype), {
    constructor: pd,
    load: function(a, b, c, d) {
      function f() {
        l.removeEventListener("load", f, !1);
        l.removeEventListener("error", g, !1);
        Fc.add(a, this);
        b && b(this);
        k.manager.itemEnd(a)
      }

      function g(b) {
        l.removeEventListener("load", f, !1);
        l.removeEventListener("error", g, !1);
        d && d(b);
        k.manager.itemError(a);
        k.manager.itemEnd(a)
      }
      void 0 !== this.path && (a = this.path + a);
      a = this.manager.resolveURL(a);
      var k = this,
        m = Fc.get(a);
      if (void 0 !== m) return k.manager.itemStart(a), setTimeout(function() {
        b && b(m);
        k.manager.itemEnd(a)
      }, 0), m;
      var l =
        V.createElementNS("1999xhtml", "img");
      l.addEventListener("load", f, !1);
      l.addEventListener("error", g, !1);
      "data:" !== a.substr(0, 5) && void 0 !== this.crossOrigin && (l.crossOrigin = this.crossOrigin);
      k.manager.itemStart(a);
      l.src = a;
      return l
    }
  });
  qf.prototype = Object.assign(Object.create(X.prototype), {
    constructor: qf,
    load: function(a, b, c, d) {
      function f(c) {
        k.load(a[c], function(a) {
          g.images[c] = a;
          m++;
          6 === m && (g.needsUpdate = !0, b && b(g))
        }, void 0, d)
      }
      var g = new vb,
        k = new pd(this.manager);
      k.setCrossOrigin(this.crossOrigin);
      k.setPath(this.path);
      var m = 0;
      for (c = 0; c < a.length; ++c) f(c);
      return g
    }
  });
  rf.prototype = Object.assign(Object.create(X.prototype), {
    constructor: rf,
    load: function(a, b, c, d) {
      var f = new S,
        g = new pd(this.manager);
      g.setCrossOrigin(this.crossOrigin);
      g.setPath(this.path);
      g.load(a, function(c) {
        f.image = c;
        c = 0 < a.search(/\.jpe?g($|\?)/i) || 0 === a.search(/^data:image\/jpeg/);
        f.format = c ? 1022 : 1023;
        f.needsUpdate = !0;
        void 0 !== b && b(f)
      }, c, d);
      return f
    }
  });
  Object.assign(M.prototype, {
    getPoint: function() {
      console.warn("THREE.Curve: .getPoint() not implemented.");
      return null
    },
    getPointAt: function(a, b) {
      a = this.getUtoTmapping(a);
      return this.getPoint(a, b)
    },
    getPoints: function(a) {
      void 0 === a && (a = 5);
      for (var b = [], c = 0; c <= a; c++) b.push(this.getPoint(c / a));
      return b
    },
    getSpacedPoints: function(a) {
      void 0 === a && (a = 5);
      for (var b = [], c = 0; c <= a; c++) b.push(this.getPointAt(c / a));
      return b
    },
    getLength: function() {
      var a = this.getLengths();
      return a[a.length - 1]
    },
    getLengths: function(a) {
      void 0 === a && (a = this.arcLengthDivisions);
      if (this.cacheArcLengths && this.cacheArcLengths.length === a + 1 && !this.needsUpdate) return this.cacheArcLengths;
      this.needsUpdate = !1;
      var b = [],
        c = this.getPoint(0),
        d, f = 0;
      b.push(0);
      for (d = 1; d <= a; d++) {
        var g = this.getPoint(d / a);
        f += g.distanceTo(c);
        b.push(f);
        c = g
      }
      return this.cacheArcLengths = b
    },
    updateArcLengths: function() {
      this.needsUpdate = !0;
      this.getLengths()
    },
    getUtoTmapping: function(a, b) {
      var c = this.getLengths(),
        d = c.length;
      b = b ? b : a * c[d - 1];
      for (var f = 0, g = d - 1, k; f <= g;)
        if (a = Math.floor(f + (g - f) / 2), k = c[a] - b, 0 > k) f = a + 1;
        else if (0 < k) g = a - 1;
      else {
        g = a;
        break
      }
      a = g;
      if (c[a] === b) return a / (d - 1);
      f = c[a];
      return (a + (b - f) / (c[a + 1] - f)) / (d - 1)
    },
    getTangent: function(a) {
      var b =
        a - 1E-4;
      a += 1E-4;
      0 > b && (b = 0);
      1 < a && (a = 1);
      b = this.getPoint(b);
      return this.getPoint(a).clone().sub(b).normalize()
    },
    getTangentAt: function(a) {
      a = this.getUtoTmapping(a);
      return this.getTangent(a)
    },
    computeFrenetFrames: function(a, b) {
      var c = new q,
        d = [],
        f = [],
        g = [],
        k = new q,
        m = new I,
        l;
      for (l = 0; l <= a; l++) {
        var p = l / a;
        d[l] = this.getTangentAt(p);
        d[l].normalize()
      }
      f[0] = new q;
      g[0] = new q;
      l = Number.MAX_VALUE;
      p = Math.abs(d[0].x);
      var y = Math.abs(d[0].y),
        t = Math.abs(d[0].z);
      p <= l && (l = p, c.set(1, 0, 0));
      y <= l && (l = y, c.set(0, 1, 0));
      t <= l && c.set(0,
        0, 1);
      k.crossVectors(d[0], c).normalize();
      f[0].crossVectors(d[0], k);
      g[0].crossVectors(d[0], f[0]);
      for (l = 1; l <= a; l++) f[l] = f[l - 1].clone(), g[l] = g[l - 1].clone(), k.crossVectors(d[l - 1], d[l]), k.length() > Number.EPSILON && (k.normalize(), c = Math.acos(N.clamp(d[l - 1].dot(d[l]), -1, 1)), f[l].applyMatrix4(m.makeRotationAxis(k, c))), g[l].crossVectors(d[l], f[l]);
      if (!0 === b)
        for (c = Math.acos(N.clamp(f[0].dot(f[a]), -1, 1)), c /= a, 0 < d[0].dot(k.crossVectors(f[0], f[a])) && (c = -c), l = 1; l <= a; l++) f[l].applyMatrix4(m.makeRotationAxis(d[l],
          c * l)), g[l].crossVectors(d[l], f[l]);
      return {
        tangents: d,
        normals: f,
        binormals: g
      }
    },
    clone: function() {
      return (new this.constructor).copy(this)
    },
    copy: function(a) {
      this.arcLengthDivisions = a.arcLengthDivisions;
      return this
    },
    toJSON: function() {
      var a = {
        metadata: {
          version: 4.5,
          type: "Curve",
          generator: "Curve.toJSON"
        }
      };
      a.arcLengthDivisions = this.arcLengthDivisions;
      a.type = this.type;
      return a
    },
    fromJSON: function(a) {
      this.arcLengthDivisions = a.arcLengthDivisions;
      return this
    }
  });
  Ma.prototype = Object.create(M.prototype);
  Ma.prototype.constructor =
    Ma;
  Ma.prototype.isEllipseCurve = !0;
  Ma.prototype.getPoint = function(a, b) {
    b = b || new z;
    for (var c = 2 * Math.PI, d = this.aEndAngle - this.aStartAngle, f = Math.abs(d) < Number.EPSILON; 0 > d;) d += c;
    for (; d > c;) d -= c;
    d < Number.EPSILON && (d = f ? 0 : c);
    !0 !== this.aClockwise || f || (d = d === c ? -c : d - c);
    c = this.aStartAngle + a * d;
    a = this.aX + this.xRadius * Math.cos(c);
    var g = this.aY + this.yRadius * Math.sin(c);
    0 !== this.aRotation && (c = Math.cos(this.aRotation), d = Math.sin(this.aRotation), f = a - this.aX, g -= this.aY, a = f * c - g * d + this.aX, g = f * d + g * c + this.aY);
    return b.set(a,
      g)
  };
  Ma.prototype.copy = function(a) {
    M.prototype.copy.call(this, a);
    this.aX = a.aX;
    this.aY = a.aY;
    this.xRadius = a.xRadius;
    this.yRadius = a.yRadius;
    this.aStartAngle = a.aStartAngle;
    this.aEndAngle = a.aEndAngle;
    this.aClockwise = a.aClockwise;
    this.aRotation = a.aRotation;
    return this
  };
  Ma.prototype.toJSON = function() {
    var a = M.prototype.toJSON.call(this);
    a.aX = this.aX;
    a.aY = this.aY;
    a.xRadius = this.xRadius;
    a.yRadius = this.yRadius;
    a.aStartAngle = this.aStartAngle;
    a.aEndAngle = this.aEndAngle;
    a.aClockwise = this.aClockwise;
    a.aRotation =
      this.aRotation;
    return a
  };
  Ma.prototype.fromJSON = function(a) {
    M.prototype.fromJSON.call(this, a);
    this.aX = a.aX;
    this.aY = a.aY;
    this.xRadius = a.xRadius;
    this.yRadius = a.yRadius;
    this.aStartAngle = a.aStartAngle;
    this.aEndAngle = a.aEndAngle;
    this.aClockwise = a.aClockwise;
    this.aRotation = a.aRotation;
    return this
  };
  qd.prototype = Object.create(Ma.prototype);
  qd.prototype.constructor = qd;
  qd.prototype.isArcCurve = !0;
  var fg = new q,
    Gh = new Rg,
    Hh = new Rg,
    Ih = new Rg;
  la.prototype = Object.create(M.prototype);
  la.prototype.constructor = la;
  la.prototype.isCatmullRomCurve3 = !0;
  la.prototype.getPoint = function(a, b) {
    b = b || new q;
    var c = this.points,
      d = c.length;
    a *= d - (this.closed ? 0 : 1);
    var f = Math.floor(a);
    a -= f;
    this.closed ? f += 0 < f ? 0 : (Math.floor(Math.abs(f) / d) + 1) * d : 0 === a && f === d - 1 && (f = d - 2, a = 1);
    if (this.closed || 0 < f) var g = c[(f - 1) % d];
    else fg.subVectors(c[0], c[1]).add(c[0]), g = fg;
    var k = c[f % d];
    var m = c[(f + 1) % d];
    this.closed || f + 2 < d ? c = c[(f + 2) % d] : (fg.subVectors(c[d - 1], c[d - 2]).add(c[d - 1]), c = fg);
    if ("centripetal" === this.curveType || "chordal" === this.curveType) {
      var l = "chordal" === this.curveType ? .5 : .25;
      d = Math.pow(g.distanceToSquared(k), l);
      f = Math.pow(k.distanceToSquared(m), l);
      l = Math.pow(m.distanceToSquared(c), l);
      1E-4 > f && (f = 1);
      1E-4 > d && (d = f);
      1E-4 > l && (l = f);
      Gh.initNonuniformCatmullRom(g.x, k.x, m.x, c.x, d, f, l);
      Hh.initNonuniformCatmullRom(g.y, k.y, m.y, c.y, d, f, l);
      Ih.initNonuniformCatmullRom(g.z, k.z, m.z, c.z, d, f, l)
    } else "catmullrom" === this.curveType && (Gh.initCatmullRom(g.x, k.x, m.x, c.x, this.tension), Hh.initCatmullRom(g.y, k.y, m.y, c.y, this.tension), Ih.initCatmullRom(g.z, k.z, m.z, c.z, this.tension));
    b.set(Gh.calc(a),
      Hh.calc(a), Ih.calc(a));
    return b
  };
  la.prototype.copy = function(a) {
    M.prototype.copy.call(this, a);
    this.points = [];
    for (var b = 0, c = a.points.length; b < c; b++) this.points.push(a.points[b].clone());
    this.closed = a.closed;
    this.curveType = a.curveType;
    this.tension = a.tension;
    return this
  };
  la.prototype.toJSON = function() {
    var a = M.prototype.toJSON.call(this);
    a.points = [];
    for (var b = 0, c = this.points.length; b < c; b++) a.points.push(this.points[b].toArray());
    a.closed = this.closed;
    a.curveType = this.curveType;
    a.tension = this.tension;
    return a
  };
  la.prototype.fromJSON = function(a) {
    M.prototype.fromJSON.call(this, a);
    this.points = [];
    for (var b = 0, c = a.points.length; b < c; b++) {
      var d = a.points[b];
      this.points.push((new q).fromArray(d))
    }
    this.closed = a.closed;
    this.curveType = a.curveType;
    this.tension = a.tension;
    return this
  };
  Xa.prototype = Object.create(M.prototype);
  Xa.prototype.constructor = Xa;
  Xa.prototype.isCubicBezierCurve = !0;
  Xa.prototype.getPoint = function(a, b) {
    b = b || new z;
    var c = this.v0,
      d = this.v1,
      f = this.v2,
      g = this.v3;
    b.set(Ce(a, c.x, d.x, f.x, g.x), Ce(a, c.y, d.y, f.y,
      g.y));
    return b
  };
  Xa.prototype.copy = function(a) {
    M.prototype.copy.call(this, a);
    this.v0.copy(a.v0);
    this.v1.copy(a.v1);
    this.v2.copy(a.v2);
    this.v3.copy(a.v3);
    return this
  };
  Xa.prototype.toJSON = function() {
    var a = M.prototype.toJSON.call(this);
    a.v0 = this.v0.toArray();
    a.v1 = this.v1.toArray();
    a.v2 = this.v2.toArray();
    a.v3 = this.v3.toArray();
    return a
  };
  Xa.prototype.fromJSON = function(a) {
    M.prototype.fromJSON.call(this, a);
    this.v0.fromArray(a.v0);
    this.v1.fromArray(a.v1);
    this.v2.fromArray(a.v2);
    this.v3.fromArray(a.v3);
    return this
  };
  lb.prototype = Object.create(M.prototype);
  lb.prototype.constructor = lb;
  lb.prototype.isCubicBezierCurve3 = !0;
  lb.prototype.getPoint = function(a, b) {
    b = b || new q;
    var c = this.v0,
      d = this.v1,
      f = this.v2,
      g = this.v3;
    b.set(Ce(a, c.x, d.x, f.x, g.x), Ce(a, c.y, d.y, f.y, g.y), Ce(a, c.z, d.z, f.z, g.z));
    return b
  };
  lb.prototype.copy = function(a) {
    M.prototype.copy.call(this, a);
    this.v0.copy(a.v0);
    this.v1.copy(a.v1);
    this.v2.copy(a.v2);
    this.v3.copy(a.v3);
    return this
  };
  lb.prototype.toJSON = function() {
    var a = M.prototype.toJSON.call(this);
    a.v0 = this.v0.toArray();
    a.v1 = this.v1.toArray();
    a.v2 = this.v2.toArray();
    a.v3 = this.v3.toArray();
    return a
  };
  lb.prototype.fromJSON = function(a) {
    M.prototype.fromJSON.call(this, a);
    this.v0.fromArray(a.v0);
    this.v1.fromArray(a.v1);
    this.v2.fromArray(a.v2);
    this.v3.fromArray(a.v3);
    return this
  };
  Ga.prototype = Object.create(M.prototype);
  Ga.prototype.constructor = Ga;
  Ga.prototype.isLineCurve = !0;
  Ga.prototype.getPoint = function(a, b) {
    b = b || new z;
    1 === a ? b.copy(this.v2) : (b.copy(this.v2).sub(this.v1), b.multiplyScalar(a).add(this.v1));
    return b
  };
  Ga.prototype.getPointAt =
    function(a, b) {
      return this.getPoint(a, b)
    };
  Ga.prototype.getTangent = function() {
    return this.v2.clone().sub(this.v1).normalize()
  };
  Ga.prototype.copy = function(a) {
    M.prototype.copy.call(this, a);
    this.v1.copy(a.v1);
    this.v2.copy(a.v2);
    return this
  };
  Ga.prototype.toJSON = function() {
    var a = M.prototype.toJSON.call(this);
    a.v1 = this.v1.toArray();
    a.v2 = this.v2.toArray();
    return a
  };
  Ga.prototype.fromJSON = function(a) {
    M.prototype.fromJSON.call(this, a);
    this.v1.fromArray(a.v1);
    this.v2.fromArray(a.v2);
    return this
  };
  Ya.prototype =
    Object.create(M.prototype);
  Ya.prototype.constructor = Ya;
  Ya.prototype.isLineCurve3 = !0;
  Ya.prototype.getPoint = function(a, b) {
    b = b || new q;
    1 === a ? b.copy(this.v2) : (b.copy(this.v2).sub(this.v1), b.multiplyScalar(a).add(this.v1));
    return b
  };
  Ya.prototype.getPointAt = function(a, b) {
    return this.getPoint(a, b)
  };
  Ya.prototype.copy = function(a) {
    M.prototype.copy.call(this, a);
    this.v1.copy(a.v1);
    this.v2.copy(a.v2);
    return this
  };
  Ya.prototype.toJSON = function() {
    var a = M.prototype.toJSON.call(this);
    a.v1 = this.v1.toArray();
    a.v2 = this.v2.toArray();
    return a
  };
  Ya.prototype.fromJSON = function(a) {
    M.prototype.fromJSON.call(this, a);
    this.v1.fromArray(a.v1);
    this.v2.fromArray(a.v2);
    return this
  };
  Za.prototype = Object.create(M.prototype);
  Za.prototype.constructor = Za;
  Za.prototype.isQuadraticBezierCurve = !0;
  Za.prototype.getPoint = function(a, b) {
    b = b || new z;
    var c = this.v0,
      d = this.v1,
      f = this.v2;
    b.set(Be(a, c.x, d.x, f.x), Be(a, c.y, d.y, f.y));
    return b
  };
  Za.prototype.copy = function(a) {
    M.prototype.copy.call(this, a);
    this.v0.copy(a.v0);
    this.v1.copy(a.v1);
    this.v2.copy(a.v2);
    return this
  };
  Za.prototype.toJSON = function() {
    var a = M.prototype.toJSON.call(this);
    a.v0 = this.v0.toArray();
    a.v1 = this.v1.toArray();
    a.v2 = this.v2.toArray();
    return a
  };
  Za.prototype.fromJSON = function(a) {
    M.prototype.fromJSON.call(this, a);
    this.v0.fromArray(a.v0);
    this.v1.fromArray(a.v1);
    this.v2.fromArray(a.v2);
    return this
  };
  mb.prototype = Object.create(M.prototype);
  mb.prototype.constructor = mb;
  mb.prototype.isQuadraticBezierCurve3 = !0;
  mb.prototype.getPoint = function(a, b) {
    b = b || new q;
    var c = this.v0,
      d = this.v1,
      f = this.v2;
    b.set(Be(a, c.x,
      d.x, f.x), Be(a, c.y, d.y, f.y), Be(a, c.z, d.z, f.z));
    return b
  };
  mb.prototype.copy = function(a) {
    M.prototype.copy.call(this, a);
    this.v0.copy(a.v0);
    this.v1.copy(a.v1);
    this.v2.copy(a.v2);
    return this
  };
  mb.prototype.toJSON = function() {
    var a = M.prototype.toJSON.call(this);
    a.v0 = this.v0.toArray();
    a.v1 = this.v1.toArray();
    a.v2 = this.v2.toArray();
    return a
  };
  mb.prototype.fromJSON = function(a) {
    M.prototype.fromJSON.call(this, a);
    this.v0.fromArray(a.v0);
    this.v1.fromArray(a.v1);
    this.v2.fromArray(a.v2);
    return this
  };
  $a.prototype = Object.create(M.prototype);
  $a.prototype.constructor = $a;
  $a.prototype.isSplineCurve = !0;
  $a.prototype.getPoint = function(a, b) {
    b = b || new z;
    var c = this.points,
      d = (c.length - 1) * a;
    a = Math.floor(d);
    d -= a;
    var f = c[0 === a ? a : a - 1],
      g = c[a],
      k = c[a > c.length - 2 ? c.length - 1 : a + 1];
    c = c[a > c.length - 3 ? c.length - 1 : a + 2];
    b.set(Mi(d, f.x, g.x, k.x, c.x), Mi(d, f.y, g.y, k.y, c.y));
    return b
  };
  $a.prototype.copy = function(a) {
    M.prototype.copy.call(this, a);
    this.points = [];
    for (var b = 0, c = a.points.length; b < c; b++) this.points.push(a.points[b].clone());
    return this
  };
  $a.prototype.toJSON = function() {
    var a =
      M.prototype.toJSON.call(this);
    a.points = [];
    for (var b = 0, c = this.points.length; b < c; b++) a.points.push(this.points[b].toArray());
    return a
  };
  $a.prototype.fromJSON = function(a) {
    M.prototype.fromJSON.call(this, a);
    this.points = [];
    for (var b = 0, c = a.points.length; b < c; b++) {
      var d = a.points[b];
      this.points.push((new z).fromArray(d))
    }
    return this
  };
  var Jh = Object.freeze({
    __proto__: null,
    ArcCurve: qd,
    CatmullRomCurve3: la,
    CubicBezierCurve: Xa,
    CubicBezierCurve3: lb,
    EllipseCurve: Ma,
    LineCurve: Ga,
    LineCurve3: Ya,
    QuadraticBezierCurve: Za,
    QuadraticBezierCurve3: mb,
    SplineCurve: $a
  });
  zb.prototype = Object.assign(Object.create(M.prototype), {
    constructor: zb,
    add: function(a) {
      this.curves.push(a)
    },
    closePath: function() {
      var a = this.curves[0].getPoint(0),
        b = this.curves[this.curves.length - 1].getPoint(1);
      a.equals(b) || this.curves.push(new Ga(b, a))
    },
    getPoint: function(a) {
      var b = a * this.getLength(),
        c = this.getCurveLengths();
      for (a = 0; a < c.length;) {
        if (c[a] >= b) return b = c[a] - b, a = this.curves[a], c = a.getLength(), a.getPointAt(0 === c ? 0 : 1 - b / c);
        a++
      }
      return null
    },
    getLength: function() {
      var a =
        this.getCurveLengths();
      return a[a.length - 1]
    },
    updateArcLengths: function() {
      this.needsUpdate = !0;
      this.cacheLengths = null;
      this.getCurveLengths()
    },
    getCurveLengths: function() {
      if (this.cacheLengths && this.cacheLengths.length === this.curves.length) return this.cacheLengths;
      for (var a = [], b = 0, c = 0, d = this.curves.length; c < d; c++) b += this.curves[c].getLength(), a.push(b);
      return this.cacheLengths = a
    },
    getSpacedPoints: function(a) {
      void 0 === a && (a = 40);
      for (var b = [], c = 0; c <= a; c++) b.push(this.getPoint(c / a));
      this.autoClose && b.push(b[0]);
      return b
    },
    getPoints: function(a) {
      a = a || 12;
      for (var b = [], c, d = 0, f = this.curves; d < f.length; d++) {
        var g = f[d];
        g = g.getPoints(g && g.isEllipseCurve ? 2 * a : g && (g.isLineCurve || g.isLineCurve3) ? 1 : g && g.isSplineCurve ? a * g.points.length : a);
        for (var k = 0; k < g.length; k++) {
          var m = g[k];
          c && c.equals(m) || (b.push(m), c = m)
        }
      }
      this.autoClose && 1 < b.length && !b[b.length - 1].equals(b[0]) && b.push(b[0]);
      return b
    },
    copy: function(a) {
      M.prototype.copy.call(this, a);
      this.curves = [];
      for (var b = 0, c = a.curves.length; b < c; b++) this.curves.push(a.curves[b].clone());
      this.autoClose = a.autoClose;
      return this
    },
    toJSON: function() {
      var a = M.prototype.toJSON.call(this);
      a.autoClose = this.autoClose;
      a.curves = [];
      for (var b = 0, c = this.curves.length; b < c; b++) a.curves.push(this.curves[b].toJSON());
      return a
    },
    fromJSON: function(a) {
      M.prototype.fromJSON.call(this, a);
      this.autoClose = a.autoClose;
      this.curves = [];
      for (var b = 0, c = a.curves.length; b < c; b++) {
        var d = a.curves[b];
        this.curves.push((new Jh[d.type]).fromJSON(d))
      }
      return this
    }
  });
  ab.prototype = Object.assign(Object.create(zb.prototype), {
    constructor: ab,
    setFromPoints: function(a) {
      this.moveTo(a[0].x, a[0].y);
      for (var b = 1, c = a.length; b < c; b++) this.lineTo(a[b].x, a[b].y);
      return this
    },
    moveTo: function(a, b) {
      this.currentPoint.set(a, b);
      return this
    },
    lineTo: function(a, b) {
      var c = new Ga(this.currentPoint.clone(), new z(a, b));
      this.curves.push(c);
      this.currentPoint.set(a, b);
      return this
    },
    quadraticCurveTo: function(a, b, c, d) {
      a = new Za(this.currentPoint.clone(), new z(a, b), new z(c, d));
      this.curves.push(a);
      this.currentPoint.set(c, d);
      return this
    },
    bezierCurveTo: function(a, b, c, d,
      f, g) {
      a = new Xa(this.currentPoint.clone(), new z(a, b), new z(c, d), new z(f, g));
      this.curves.push(a);
      this.currentPoint.set(f, g);
      return this
    },
    splineThru: function(a) {
      var b = [this.currentPoint.clone()].concat(a);
      b = new $a(b);
      this.curves.push(b);
      this.currentPoint.copy(a[a.length - 1]);
      return this
    },
    arc: function(a, b, c, d, f, g) {
      this.absarc(a + this.currentPoint.x, b + this.currentPoint.y, c, d, f, g);
      return this
    },
    absarc: function(a, b, c, d, f, g) {
      this.absellipse(a, b, c, c, d, f, g);
      return this
    },
    ellipse: function(a, b, c, d, f, g, k, m) {
      this.absellipse(a +
        this.currentPoint.x, b + this.currentPoint.y, c, d, f, g, k, m);
      return this
    },
    absellipse: function(a, b, c, d, f, g, k, m) {
      a = new Ma(a, b, c, d, f, g, k, m);
      0 < this.curves.length && (b = a.getPoint(0), b.equals(this.currentPoint) || this.lineTo(b.x, b.y));
      this.curves.push(a);
      a = a.getPoint(1);
      this.currentPoint.copy(a);
      return this
    },
    copy: function(a) {
      zb.prototype.copy.call(this, a);
      this.currentPoint.copy(a.currentPoint);
      return this
    },
    toJSON: function() {
      var a = zb.prototype.toJSON.call(this);
      a.currentPoint = this.currentPoint.toArray();
      return a
    },
    fromJSON: function(a) {
      zb.prototype.fromJSON.call(this, a);
      this.currentPoint.fromArray(a.currentPoint);
      return this
    }
  });
  Pb.prototype = Object.assign(Object.create(ab.prototype), {
    constructor: Pb,
    getPointsHoles: function(a) {
      for (var b = [], c = 0, d = this.holes.length; c < d; c++) b[c] = this.holes[c].getPoints(a);
      return b
    },
    extractPoints: function(a) {
      return {
        shape: this.getPoints(a),
        holes: this.getPointsHoles(a)
      }
    },
    copy: function(a) {
      ab.prototype.copy.call(this, a);
      this.holes = [];
      for (var b = 0, c = a.holes.length; b < c; b++) this.holes.push(a.holes[b].clone());
      return this
    },
    toJSON: function() {
      var a = ab.prototype.toJSON.call(this);
      a.uuid = this.uuid;
      a.holes = [];
      for (var b = 0, c = this.holes.length; b < c; b++) a.holes.push(this.holes[b].toJSON());
      return a
    },
    fromJSON: function(a) {
      ab.prototype.fromJSON.call(this, a);
      this.uuid = a.uuid;
      this.holes = [];
      for (var b = 0, c = a.holes.length; b < c; b++) {
        var d = a.holes[b];
        this.holes.push((new ab).fromJSON(d))
      }
      return this
    }
  });
  da.prototype = Object.assign(Object.create(E.prototype), {
    constructor: da,
    isLight: !0,
    copy: function(a) {
      E.prototype.copy.call(this,
        a);
      this.color.copy(a.color);
      this.intensity = a.intensity;
      return this
    },
    toJSON: function(a) {
      a = E.prototype.toJSON.call(this, a);
      a.object.color = this.color.getHex();
      a.object.intensity = this.intensity;
      void 0 !== this.groundColor && (a.object.groundColor = this.groundColor.getHex());
      void 0 !== this.distance && (a.object.distance = this.distance);
      void 0 !== this.angle && (a.object.angle = this.angle);
      void 0 !== this.decay && (a.object.decay = this.decay);
      void 0 !== this.penumbra && (a.object.penumbra = this.penumbra);
      void 0 !== this.shadow &&
        (a.object.shadow = this.shadow.toJSON());
      return a
    }
  });
  sf.prototype = Object.assign(Object.create(da.prototype), {
    constructor: sf,
    isHemisphereLight: !0,
    copy: function(a) {
      da.prototype.copy.call(this, a);
      this.groundColor.copy(a.groundColor);
      return this
    }
  });
  Object.assign(nb.prototype, {
    _projScreenMatrix: new I,
    _lightPositionWorld: new q,
    _lookTarget: new q,
    getViewportCount: function() {
      return this._viewportCount
    },
    getFrustum: function() {
      return this._frustum
    },
    updateMatrices: function(a) {
      var b = this.camera,
        c = this.matrix,
        d = this._projScreenMatrix,
        f = this._lookTarget,
        g = this._lightPositionWorld;
      g.setFromMatrixPosition(a.matrixWorld);
      b.position.copy(g);
      f.setFromMatrixPosition(a.target.matrixWorld);
      b.lookAt(f);
      b.updateMatrixWorld();
      d.multiplyMatrices(b.projectionMatrix, b.matrixWorldInverse);
      this._frustum.setFromMatrix(d);
      c.set(.5, 0, 0, .5, 0, .5, 0, .5, 0, 0, .5, .5, 0, 0, 0, 1);
      c.multiply(b.projectionMatrix);
      c.multiply(b.matrixWorldInverse)
    },
    getViewport: function(a) {
      return this._viewports[a]
    },
    getFrameExtents: function() {
      return this._frameExtents
    },
    copy: function(a) {
      this.camera =
        a.camera.clone();
      this.bias = a.bias;
      this.radius = a.radius;
      this.mapSize.copy(a.mapSize);
      return this
    },
    clone: function() {
      return (new this.constructor).copy(this)
    },
    toJSON: function() {
      var a = {};
      0 !== this.bias && (a.bias = this.bias);
      1 !== this.radius && (a.radius = this.radius);
      if (512 !== this.mapSize.x || 512 !== this.mapSize.y) a.mapSize = this.mapSize.toArray();
      a.camera = this.camera.toJSON(!1).object;
      delete a.camera.matrix;
      return a
    }
  });
  tf.prototype = Object.assign(Object.create(nb.prototype), {
    constructor: tf,
    isSpotLightShadow: !0,
    updateMatrices: function(a) {
      var b = this.camera,
        c = 2 * N.RAD2DEG * a.angle,
        d = this.mapSize.width / this.mapSize.height,
        f = a.distance || b.far;
      if (c !== b.fov || d !== b.aspect || f !== b.far) b.fov = c, b.aspect = d, b.far = f, b.updateProjectionMatrix();
      nb.prototype.updateMatrices.call(this, a)
    }
  });
  uf.prototype = Object.assign(Object.create(da.prototype), {
    constructor: uf,
    isSpotLight: !0,
    copy: function(a) {
      da.prototype.copy.call(this, a);
      this.distance = a.distance;
      this.angle = a.angle;
      this.penumbra = a.penumbra;
      this.decay = a.decay;
      this.target = a.target.clone();
      this.shadow = a.shadow.clone();
      return this
    }
  });
  Sg.prototype = Object.assign(Object.create(nb.prototype), {
    constructor: Sg,
    isPointLightShadow: !0,
    updateMatrices: function(a, b) {
      void 0 === b && (b = 0);
      var c = this.camera,
        d = this.matrix,
        f = this._lightPositionWorld,
        g = this._lookTarget,
        k = this._projScreenMatrix;
      f.setFromMatrixPosition(a.matrixWorld);
      c.position.copy(f);
      g.copy(c.position);
      g.add(this._cubeDirections[b]);
      c.up.copy(this._cubeUps[b]);
      c.lookAt(g);
      c.updateMatrixWorld();
      d.makeTranslation(-f.x, -f.y, -f.z);
      k.multiplyMatrices(c.projectionMatrix,
        c.matrixWorldInverse);
      this._frustum.setFromMatrix(k)
    }
  });
  vf.prototype = Object.assign(Object.create(da.prototype), {
    constructor: vf,
    isPointLight: !0,
    copy: function(a) {
      da.prototype.copy.call(this, a);
      this.distance = a.distance;
      this.decay = a.decay;
      this.shadow = a.shadow.clone();
      return this
    }
  });
  De.prototype = Object.assign(Object.create(hb.prototype), {
    constructor: De,
    isOrthographicCamera: !0,
    copy: function(a, b) {
      hb.prototype.copy.call(this, a, b);
      this.left = a.left;
      this.right = a.right;
      this.top = a.top;
      this.bottom = a.bottom;
      this.near =
        a.near;
      this.far = a.far;
      this.zoom = a.zoom;
      this.view = null === a.view ? null : Object.assign({}, a.view);
      return this
    },
    setViewOffset: function(a, b, c, d, f, g) {
      null === this.view && (this.view = {
        enabled: !0,
        fullWidth: 1,
        fullHeight: 1,
        offsetX: 0,
        offsetY: 0,
        width: 1,
        height: 1
      });
      this.view.enabled = !0;
      this.view.fullWidth = a;
      this.view.fullHeight = b;
      this.view.offsetX = c;
      this.view.offsetY = d;
      this.view.width = f;
      this.view.height = g;
      this.updateProjectionMatrix()
    },
    clearViewOffset: function() {
      null !== this.view && (this.view.enabled = !1);
      this.updateProjectionMatrix()
    },
    updateProjectionMatrix: function() {
      var a = (this.right - this.left) / (2 * this.zoom),
        b = (this.top - this.bottom) / (2 * this.zoom),
        c = (this.right + this.left) / 2,
        d = (this.top + this.bottom) / 2,
        f = c - a;
      c += a;
      a = d + b;
      b = d - b;
      if (null !== this.view && this.view.enabled) {
        c = this.zoom / (this.view.width / this.view.fullWidth);
        b = this.zoom / (this.view.height / this.view.fullHeight);
        var g = (this.right - this.left) / this.view.width;
        d = (this.top - this.bottom) / this.view.height;
        f += this.view.offsetX / c * g;
        c = f + this.view.width / c * g;
        a -= this.view.offsetY / b * d;
        b = a - this.view.height /
          b * d
      }
      this.projectionMatrix.makeOrthographic(f, c, a, b, this.near, this.far);
      this.projectionMatrixInverse.getInverse(this.projectionMatrix)
    },
    toJSON: function(a) {
      a = E.prototype.toJSON.call(this, a);
      a.object.zoom = this.zoom;
      a.object.left = this.left;
      a.object.right = this.right;
      a.object.top = this.top;
      a.object.bottom = this.bottom;
      a.object.near = this.near;
      a.object.far = this.far;
      null !== this.view && (a.object.view = Object.assign({}, this.view));
      return a
    }
  });
  wf.prototype = Object.assign(Object.create(nb.prototype), {
    constructor: wf,
    isDirectionalLightShadow: !0,
    updateMatrices: function(a) {
      nb.prototype.updateMatrices.call(this, a)
    }
  });
  xf.prototype = Object.assign(Object.create(da.prototype), {
    constructor: xf,
    isDirectionalLight: !0,
    copy: function(a) {
      da.prototype.copy.call(this, a);
      this.target = a.target.clone();
      this.shadow = a.shadow.clone();
      return this
    }
  });
  yf.prototype = Object.assign(Object.create(da.prototype), {
    constructor: yf,
    isAmbientLight: !0
  });
  zf.prototype = Object.assign(Object.create(da.prototype), {
    constructor: zf,
    isRectAreaLight: !0,
    copy: function(a) {
      da.prototype.copy.call(this,
        a);
      this.width = a.width;
      this.height = a.height;
      return this
    },
    toJSON: function(a) {
      a = da.prototype.toJSON.call(this, a);
      a.object.width = this.width;
      a.object.height = this.height;
      return a
    }
  });
  Af.prototype = Object.assign(Object.create(X.prototype), {
    constructor: Af,
    load: function(a, b, c, d) {
      var f = this,
        g = new Qa(f.manager);
      g.setPath(f.path);
      g.load(a, function(a) {
        b(f.parse(JSON.parse(a)))
      }, c, d)
    },
    parse: function(a) {
      function b(a) {
        void 0 === c[a] && console.warn("THREE.MaterialLoader: Undefined texture", a);
        return c[a]
      }
      var c = this.textures,
        d = new Nl[a.type];
      void 0 !== a.uuid && (d.uuid = a.uuid);
      void 0 !== a.name && (d.name = a.name);
      void 0 !== a.color && d.color.setHex(a.color);
      void 0 !== a.roughness && (d.roughness = a.roughness);
      void 0 !== a.metalness && (d.metalness = a.metalness);
      void 0 !== a.sheen && (d.sheen = (new D).setHex(a.sheen));
      void 0 !== a.emissive && d.emissive.setHex(a.emissive);
      void 0 !== a.specular && d.specular.setHex(a.specular);
      void 0 !== a.shininess && (d.shininess = a.shininess);
      void 0 !== a.clearcoat && (d.clearcoat = a.clearcoat);
      void 0 !== a.clearcoatRoughness &&
        (d.clearcoatRoughness = a.clearcoatRoughness);
      void 0 !== a.vertexColors && (d.vertexColors = a.vertexColors);
      void 0 !== a.fog && (d.fog = a.fog);
      void 0 !== a.flatShading && (d.flatShading = a.flatShading);
      void 0 !== a.blending && (d.blending = a.blending);
      void 0 !== a.combine && (d.combine = a.combine);
      void 0 !== a.side && (d.side = a.side);
      void 0 !== a.opacity && (d.opacity = a.opacity);
      void 0 !== a.transparent && (d.transparent = a.transparent);
      void 0 !== a.alphaTest && (d.alphaTest = a.alphaTest);
      void 0 !== a.depthTest && (d.depthTest = a.depthTest);
      void 0 !==
        a.depthWrite && (d.depthWrite = a.depthWrite);
      void 0 !== a.colorWrite && (d.colorWrite = a.colorWrite);
      void 0 !== a.stencilWrite && (d.stencilWrite = a.stencilWrite);
      void 0 !== a.stencilWriteMask && (d.stencilWriteMask = a.stencilWriteMask);
      void 0 !== a.stencilFunc && (d.stencilFunc = a.stencilFunc);
      void 0 !== a.stencilRef && (d.stencilRef = a.stencilRef);
      void 0 !== a.stencilFuncMask && (d.stencilFuncMask = a.stencilFuncMask);
      void 0 !== a.stencilFail && (d.stencilFail = a.stencilFail);
      void 0 !== a.stencilZFail && (d.stencilZFail = a.stencilZFail);
      void 0 !== a.stencilZPass && (d.stencilZPass = a.stencilZPass);
      void 0 !== a.wireframe && (d.wireframe = a.wireframe);
      void 0 !== a.wireframeLinewidth && (d.wireframeLinewidth = a.wireframeLinewidth);
      void 0 !== a.wireframeLinecap && (d.wireframeLinecap = a.wireframeLinecap);
      void 0 !== a.wireframeLinejoin && (d.wireframeLinejoin = a.wireframeLinejoin);
      void 0 !== a.rotation && (d.rotation = a.rotation);
      1 !== a.linewidth && (d.linewidth = a.linewidth);
      void 0 !== a.dashSize && (d.dashSize = a.dashSize);
      void 0 !== a.gapSize && (d.gapSize = a.gapSize);
      void 0 !==
        a.scale && (d.scale = a.scale);
      void 0 !== a.polygonOffset && (d.polygonOffset = a.polygonOffset);
      void 0 !== a.polygonOffsetFactor && (d.polygonOffsetFactor = a.polygonOffsetFactor);
      void 0 !== a.polygonOffsetUnits && (d.polygonOffsetUnits = a.polygonOffsetUnits);
      void 0 !== a.skinning && (d.skinning = a.skinning);
      void 0 !== a.morphTargets && (d.morphTargets = a.morphTargets);
      void 0 !== a.morphNormals && (d.morphNormals = a.morphNormals);
      void 0 !== a.dithering && (d.dithering = a.dithering);
      void 0 !== a.visible && (d.visible = a.visible);
      void 0 !== a.toneMapped &&
        (d.toneMapped = a.toneMapped);
      void 0 !== a.userData && (d.userData = a.userData);
      if (void 0 !== a.uniforms)
        for (var f in a.uniforms) {
          var g = a.uniforms[f];
          d.uniforms[f] = {};
          switch (g.type) {
            case "t":
              d.uniforms[f].value = b(g.value);
              break;
            case "c":
              d.uniforms[f].value = (new D).setHex(g.value);
              break;
            case "v2":
              d.uniforms[f].value = (new z).fromArray(g.value);
              break;
            case "v3":
              d.uniforms[f].value = (new q).fromArray(g.value);
              break;
            case "v4":
              d.uniforms[f].value = (new ca).fromArray(g.value);
              break;
            case "m3":
              d.uniforms[f].value = (new ka).fromArray(g.value);
            case "m4":
              d.uniforms[f].value = (new I).fromArray(g.value);
              break;
            default:
              d.uniforms[f].value = g.value
          }
        }
      void 0 !== a.defines && (d.defines = a.defines);
      void 0 !== a.vertexShader && (d.vertexShader = a.vertexShader);
      void 0 !== a.fragmentShader && (d.fragmentShader = a.fragmentShader);
      if (void 0 !== a.extensions)
        for (var k in a.extensions) d.extensions[k] = a.extensions[k];
      void 0 !== a.shading && (d.flatShading = 1 === a.shading);
      void 0 !== a.size && (d.size = a.size);
      void 0 !== a.sizeAttenuation && (d.sizeAttenuation = a.sizeAttenuation);
      void 0 !==
        a.map && (d.map = b(a.map));
      void 0 !== a.matcap && (d.matcap = b(a.matcap));
      void 0 !== a.alphaMap && (d.alphaMap = b(a.alphaMap), d.transparent = !0);
      void 0 !== a.bumpMap && (d.bumpMap = b(a.bumpMap));
      void 0 !== a.bumpScale && (d.bumpScale = a.bumpScale);
      void 0 !== a.normalMap && (d.normalMap = b(a.normalMap));
      void 0 !== a.normalMapType && (d.normalMapType = a.normalMapType);
      void 0 !== a.normalScale && (f = a.normalScale, !1 === Array.isArray(f) && (f = [f, f]), d.normalScale = (new z).fromArray(f));
      void 0 !== a.displacementMap && (d.displacementMap = b(a.displacementMap));
      void 0 !== a.displacementScale && (d.displacementScale = a.displacementScale);
      void 0 !== a.displacementBias && (d.displacementBias = a.displacementBias);
      void 0 !== a.roughnessMap && (d.roughnessMap = b(a.roughnessMap));
      void 0 !== a.metalnessMap && (d.metalnessMap = b(a.metalnessMap));
      void 0 !== a.emissiveMap && (d.emissiveMap = b(a.emissiveMap));
      void 0 !== a.emissiveIntensity && (d.emissiveIntensity = a.emissiveIntensity);
      void 0 !== a.specularMap && (d.specularMap = b(a.specularMap));
      void 0 !== a.envMap && (d.envMap = b(a.envMap));
      void 0 !== a.envMapIntensity &&
        (d.envMapIntensity = a.envMapIntensity);
      void 0 !== a.reflectivity && (d.reflectivity = a.reflectivity);
      void 0 !== a.refractionRatio && (d.refractionRatio = a.refractionRatio);
      void 0 !== a.lightMap && (d.lightMap = b(a.lightMap));
      void 0 !== a.lightMapIntensity && (d.lightMapIntensity = a.lightMapIntensity);
      void 0 !== a.aoMap && (d.aoMap = b(a.aoMap));
      void 0 !== a.aoMapIntensity && (d.aoMapIntensity = a.aoMapIntensity);
      void 0 !== a.gradientMap && (d.gradientMap = b(a.gradientMap));
      void 0 !== a.clearcoatNormalMap && (d.clearcoatNormalMap = b(a.clearcoatNormalMap));
      void 0 !== a.clearcoatNormalScale && (d.clearcoatNormalScale = (new z).fromArray(a.clearcoatNormalScale));
      return d
    },
    setTextures: function(a) {
      this.textures = a;
      return this
    }
  });
  var Kh = {
    decodeText: function(a) {
      if ("undefined" !== typeof TextDecoder) return (new TextDecoder).decode(a);
      for (var b = "", c = 0, d = a.length; c < d; c++) b += String.fromCharCode(a[c]);
      try {
        return decodeURIComponent(escape(b))
      } catch (f) {
        return b
      }
    },
    extractUrlBase: function(a) {
      var b = a.lastIndexOf("/");
      return -1 === b ? "./" : a.substr(0, b + 1)
    }
  };
  Bf.prototype = Object.assign(Object.create(G.prototype), {
    constructor: Bf,
    isInstancedBufferGeometry: !0,
    copy: function(a) {
      G.prototype.copy.call(this, a);
      this.maxInstancedCount = a.maxInstancedCount;
      return this
    },
    clone: function() {
      return (new this.constructor).copy(this)
    },
    toJSON: function() {
      var a = G.prototype.toJSON.call(this);
      a.maxInstancedCount = this.maxInstancedCount;
      a.isInstancedBufferGeometry = !0;
      return a
    }
  });
  Cf.prototype = Object.assign(Object.create(O.prototype), {
    constructor: Cf,
    isInstancedBufferAttribute: !0,
    copy: function(a) {
      O.prototype.copy.call(this, a);
      this.meshPerAttribute =
        a.meshPerAttribute;
      return this
    },
    toJSON: function() {
      var a = O.prototype.toJSON.call(this);
      a.meshPerAttribute = this.meshPerAttribute;
      a.isInstancedBufferAttribute = !0;
      return a
    }
  });
  Df.prototype = Object.assign(Object.create(X.prototype), {
    constructor: Df,
    load: function(a, b, c, d) {
      var f = this,
        g = new Qa(f.manager);
      g.setPath(f.path);
      g.load(a, function(a) {
        b(f.parse(JSON.parse(a)))
      }, c, d)
    },
    parse: function(a) {
      var b = a.isInstancedBufferGeometry ? new Bf : new G,
        c = a.data.index;
      if (void 0 !== c) {
        var d = new Lh[c.type](c.array);
        b.setIndex(new O(d,
          1))
      }
      c = a.data.attributes;
      for (var f in c) {
        var g = c[f];
        d = new Lh[g.type](g.array);
        d = new(g.isInstancedBufferAttribute ? Cf : O)(d, g.itemSize, g.normalized);
        void 0 !== g.name && (d.name = g.name);
        b.setAttribute(f, d)
      }
      var k = a.data.morphAttributes;
      if (k)
        for (f in k) {
          var m = k[f],
            l = [];
          c = 0;
          for (var p = m.length; c < p; c++) g = m[c], d = new Lh[g.type](g.array), d = new O(d, g.itemSize, g.normalized), void 0 !== g.name && (d.name = g.name), l.push(d);
          b.morphAttributes[f] = l
        }
      f = a.data.groups || a.data.drawcalls || a.data.offsets;
      if (void 0 !== f)
        for (c = 0, g = f.length; c !==
          g; ++c) d = f[c], b.addGroup(d.start, d.count, d.materialIndex);
      c = a.data.boundingSphere;
      void 0 !== c && (f = new q, void 0 !== c.center && f.fromArray(c.center), b.boundingSphere = new ub(f, c.radius));
      a.name && (b.name = a.name);
      a.userData && (b.userData = a.userData);
      return b
    }
  });
  var Lh = {
    Int8Array: Int8Array,
    Uint8Array: Uint8Array,
    Uint8ClampedArray: "undefined" !== typeof Uint8ClampedArray ? Uint8ClampedArray : Uint8Array,
    Int16Array: Int16Array,
    Uint16Array: Uint16Array,
    Int32Array: Int32Array,
    Uint32Array: Uint32Array,
    Float32Array: Float32Array,
    Float64Array: Float64Array
  };
  Ef.prototype = Object.assign(Object.create(X.prototype), {
    constructor: Ef,
    load: function(a, b, c, d) {
      var f = this,
        g = "" === this.path ? Kh.extractUrlBase(a) : this.path;
      this.resourcePath = this.resourcePath || g;
      g = new Qa(f.manager);
      g.setPath(this.path);
      g.load(a, function(c) {
        var g = null;
        try {
          g = JSON.parse(c)
        } catch (n) {
          void 0 !== d && d(n);
          console.error("THREE:ObjectLoader: Can't parse " + a + ".", n.message);
          return
        }
        c = g.metadata;
        void 0 === c || void 0 === c.type || "geometry" === c.type.toLowerCase() ? console.error("THREE.ObjectLoader: Can't load " +
          a) : f.parse(g, b)
      }, c, d)
    },
    parse: function(a, b) {
      var c = this.parseShape(a.shapes);
      c = this.parseGeometries(a.geometries, c);
      var d = this.parseImages(a.images, function() {
        void 0 !== b && b(f)
      });
      d = this.parseTextures(a.textures, d);
      d = this.parseMaterials(a.materials, d);
      var f = this.parseObject(a.object, c, d);
      a.animations && (f.animations = this.parseAnimations(a.animations));
      void 0 !== a.images && 0 !== a.images.length || void 0 === b || b(f);
      return f
    },
    parseShape: function(a) {
      var b = {};
      if (void 0 !== a)
        for (var c = 0, d = a.length; c < d; c++) {
          var f = (new Pb).fromJSON(a[c]);
          b[f.uuid] = f
        }
      return b
    },
    parseGeometries: function(a, b) {
      var c = {};
      if (void 0 !== a)
        for (var d = new Df, f = 0, g = a.length; f < g; f++) {
          var k = a[f];
          switch (k.type) {
            case "PlaneGeometry":
            case "PlaneBufferGeometry":
              var m = new Ba[k.type](k.width, k.height, k.widthSegments, k.heightSegments);
              break;
            case "BoxGeometry":
            case "BoxBufferGeometry":
            case "CubeGeometry":
              m = new Ba[k.type](k.width, k.height, k.depth, k.widthSegments, k.heightSegments, k.depthSegments);
              break;
            case "CircleGeometry":
            case "CircleBufferGeometry":
              m = new Ba[k.type](k.radius,
                k.segments, k.thetaStart, k.thetaLength);
              break;
            case "CylinderGeometry":
            case "CylinderBufferGeometry":
              m = new Ba[k.type](k.radiusTop, k.radiusBottom, k.height, k.radialSegments, k.heightSegments, k.openEnded, k.thetaStart, k.thetaLength);
              break;
            case "ConeGeometry":
            case "ConeBufferGeometry":
              m = new Ba[k.type](k.radius, k.height, k.radialSegments, k.heightSegments, k.openEnded, k.thetaStart, k.thetaLength);
              break;
            case "SphereGeometry":
            case "SphereBufferGeometry":
              m = new Ba[k.type](k.radius, k.widthSegments, k.heightSegments,
                k.phiStart, k.phiLength, k.thetaStart, k.thetaLength);
              break;
            case "DodecahedronGeometry":
            case "DodecahedronBufferGeometry":
            case "IcosahedronGeometry":
            case "IcosahedronBufferGeometry":
            case "OctahedronGeometry":
            case "OctahedronBufferGeometry":
            case "TetrahedronGeometry":
            case "TetrahedronBufferGeometry":
              m = new Ba[k.type](k.radius, k.detail);
              break;
            case "RingGeometry":
            case "RingBufferGeometry":
              m = new Ba[k.type](k.innerRadius, k.outerRadius, k.thetaSegments, k.phiSegments, k.thetaStart, k.thetaLength);
              break;
            case "TorusGeometry":
            case "TorusBufferGeometry":
              m =
                new Ba[k.type](k.radius, k.tube, k.radialSegments, k.tubularSegments, k.arc);
              break;
            case "TorusKnotGeometry":
            case "TorusKnotBufferGeometry":
              m = new Ba[k.type](k.radius, k.tube, k.tubularSegments, k.radialSegments, k.p, k.q);
              break;
            case "TubeGeometry":
            case "TubeBufferGeometry":
              m = new Ba[k.type]((new Jh[k.path.type]).fromJSON(k.path), k.tubularSegments, k.radius, k.radialSegments, k.closed);
              break;
            case "LatheGeometry":
            case "LatheBufferGeometry":
              m = new Ba[k.type](k.points, k.segments, k.phiStart, k.phiLength);
              break;
            case "PolyhedronGeometry":
            case "PolyhedronBufferGeometry":
              m =
                new Ba[k.type](k.vertices, k.indices, k.radius, k.details);
              break;
            case "ShapeGeometry":
            case "ShapeBufferGeometry":
              m = [];
              for (var l = 0, p = k.shapes.length; l < p; l++) {
                var q = b[k.shapes[l]];
                m.push(q)
              }
              m = new Ba[k.type](m, k.curveSegments);
              break;
            case "ExtrudeGeometry":
            case "ExtrudeBufferGeometry":
              m = [];
              l = 0;
              for (p = k.shapes.length; l < p; l++) q = b[k.shapes[l]], m.push(q);
              l = k.options.extrudePath;
              void 0 !== l && (k.options.extrudePath = (new Jh[l.type]).fromJSON(l));
              m = new Ba[k.type](m, k.options);
              break;
            case "BufferGeometry":
            case "InstancedBufferGeometry":
              m =
                d.parse(k);
              break;
            case "Geometry":
              "THREE" in kc && "LegacyJSONLoader" in THREE ? m = (new THREE.LegacyJSONLoader).parse(k, this.resourcePath).geometry : console.error('THREE.ObjectLoader: You have to import LegacyJSONLoader in order load geometry data of type "Geometry".');
              break;
            default:
              console.warn('THREE.ObjectLoader: Unsupported geometry type "' + k.type + '"');
              continue
          }
          m.uuid = k.uuid;
          void 0 !== k.name && (m.name = k.name);
          !0 === m.isBufferGeometry && void 0 !== k.userData && (m.userData = k.userData);
          c[k.uuid] = m
        }
      return c
    },
    parseMaterials: function(a,
      b) {
      var c = {},
        d = {};
      if (void 0 !== a) {
        var f = new Af;
        f.setTextures(b);
        b = 0;
        for (var g = a.length; b < g; b++) {
          var k = a[b];
          if ("MultiMaterial" === k.type) {
            for (var m = [], l = 0; l < k.materials.length; l++) {
              var p = k.materials[l];
              void 0 === c[p.uuid] && (c[p.uuid] = f.parse(p));
              m.push(c[p.uuid])
            }
            d[k.uuid] = m
          } else void 0 === c[k.uuid] && (c[k.uuid] = f.parse(k)), d[k.uuid] = c[k.uuid]
        }
      }
      return d
    },
    parseAnimations: function(a) {
      for (var b = [], c = 0; c < a.length; c++) {
        var d = a[c],
          f = Pa.parse(d);
        void 0 !== d.uuid && (f.uuid = d.uuid);
        b.push(f)
      }
      return b
    },
    parseImages: function(a,
      b) {
      function c(a) {
        d.manager.itemStart(a);
        return g.load(a, function() {
          d.manager.itemEnd(a)
        }, void 0, function() {
          d.manager.itemError(a);
          d.manager.itemEnd(a)
        })
      }
      var d = this,
        f = {};
      if (void 0 !== a && 0 < a.length) {
        b = new Og(b);
        var g = new pd(b);
        g.setCrossOrigin(this.crossOrigin);
        b = 0;
        for (var k = a.length; b < k; b++) {
          var m = a[b],
            l = m.url;
          if (Array.isArray(l)) {
            f[m.uuid] = [];
            for (var p = 0, q = l.length; p < q; p++) {
              var t = l[p];
              t = /^(\/\/)|([a-z]+:(\/\/)?)/i.test(t) ? t : d.resourcePath + t;
              f[m.uuid].push(c(t))
            }
          } else t = /^(\/\/)|([a-z]+:(\/\/)?)/i.test(m.url) ?
            m.url : d.resourcePath + m.url, f[m.uuid] = c(t)
        }
      }
      return f
    },
    parseTextures: function(a, b) {
      function c(a, b) {
        if ("number" === typeof a) return a;
        console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.", a);
        return b[a]
      }
      var d = {};
      if (void 0 !== a)
        for (var f = 0, g = a.length; f < g; f++) {
          var k = a[f];
          void 0 === k.image && console.warn('THREE.ObjectLoader: No "image" specified for', k.uuid);
          void 0 === b[k.image] && console.warn("THREE.ObjectLoader: Undefined image", k.image);
          var m = Array.isArray(b[k.image]) ? new vb(b[k.image]) :
            new S(b[k.image]);
          m.needsUpdate = !0;
          m.uuid = k.uuid;
          void 0 !== k.name && (m.name = k.name);
          void 0 !== k.mapping && (m.mapping = c(k.mapping, Ol));
          void 0 !== k.offset && m.offset.fromArray(k.offset);
          void 0 !== k.repeat && m.repeat.fromArray(k.repeat);
          void 0 !== k.center && m.center.fromArray(k.center);
          void 0 !== k.rotation && (m.rotation = k.rotation);
          void 0 !== k.wrap && (m.wrapS = c(k.wrap[0], yj), m.wrapT = c(k.wrap[1], yj));
          void 0 !== k.format && (m.format = k.format);
          void 0 !== k.type && (m.type = k.type);
          void 0 !== k.encoding && (m.encoding = k.encoding);
          void 0 !== k.minFilter && (m.minFilter = c(k.minFilter, zj));
          void 0 !== k.magFilter && (m.magFilter = c(k.magFilter, zj));
          void 0 !== k.anisotropy && (m.anisotropy = k.anisotropy);
          void 0 !== k.flipY && (m.flipY = k.flipY);
          void 0 !== k.premultiplyAlpha && (m.premultiplyAlpha = k.premultiplyAlpha);
          void 0 !== k.unpackAlignment && (m.unpackAlignment = k.unpackAlignment);
          d[k.uuid] = m
        }
      return d
    },
    parseObject: function(a, b, c) {
      function d(a) {
        void 0 === b[a] && console.warn("THREE.ObjectLoader: Undefined geometry", a);
        return b[a]
      }

      function f(a) {
        if (void 0 !==
          a) {
          if (Array.isArray(a)) {
            for (var b = [], d = 0, f = a.length; d < f; d++) {
              var g = a[d];
              void 0 === c[g] && console.warn("THREE.ObjectLoader: Undefined material", g);
              b.push(c[g])
            }
            return b
          }
          void 0 === c[a] && console.warn("THREE.ObjectLoader: Undefined material", a);
          return c[a]
        }
      }
      switch (a.type) {
        case "Scene":
          var g = new Kd;
          void 0 !== a.background && Number.isInteger(a.background) && (g.background = new D(a.background));
          void 0 !== a.fog && ("Fog" === a.fog.type ? g.fog = new df(a.fog.color, a.fog.near, a.fog.far) : "FogExp2" === a.fog.type && (g.fog = new cf(a.fog.color,
            a.fog.density)));
          break;
        case "PerspectiveCamera":
          g = new na(a.fov, a.aspect, a.near, a.far);
          void 0 !== a.focus && (g.focus = a.focus);
          void 0 !== a.zoom && (g.zoom = a.zoom);
          void 0 !== a.filmGauge && (g.filmGauge = a.filmGauge);
          void 0 !== a.filmOffset && (g.filmOffset = a.filmOffset);
          void 0 !== a.view && (g.view = Object.assign({}, a.view));
          break;
        case "OrthographicCamera":
          g = new De(a.left, a.right, a.top, a.bottom, a.near, a.far);
          void 0 !== a.zoom && (g.zoom = a.zoom);
          void 0 !== a.view && (g.view = Object.assign({}, a.view));
          break;
        case "AmbientLight":
          g =
            new yf(a.color, a.intensity);
          break;
        case "DirectionalLight":
          g = new xf(a.color, a.intensity);
          break;
        case "PointLight":
          g = new vf(a.color, a.intensity, a.distance, a.decay);
          break;
        case "RectAreaLight":
          g = new zf(a.color, a.intensity, a.width, a.height);
          break;
        case "SpotLight":
          g = new uf(a.color, a.intensity, a.distance, a.angle, a.penumbra, a.decay);
          break;
        case "HemisphereLight":
          g = new sf(a.color, a.groundColor, a.intensity);
          break;
        case "SkinnedMesh":
          console.warn("THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.");
        case "Mesh":
          g = d(a.geometry);
          var k = f(a.material);
          g = g.bones && 0 < g.bones.length ? new ce(g, k) : new ia(g, k);
          break;
        case "InstancedMesh":
          g = d(a.geometry);
          k = f(a.material);
          var m = a.instanceMatrix;
          g = new gf(g, k, a.count);
          g.instanceMatrix = new O(new Float32Array(m.array), 16);
          break;
        case "LOD":
          g = new be;
          break;
        case "Line":
          g = new pa(d(a.geometry), f(a.material), a.mode);
          break;
        case "LineLoop":
          g = new hf(d(a.geometry), f(a.material));
          break;
        case "LineSegments":
          g = new Z(d(a.geometry), f(a.material));
          break;
        case "PointCloud":
        case "Points":
          g =
            new Yc(d(a.geometry), f(a.material));
          break;
        case "Sprite":
          g = new $d(f(a.material));
          break;
        case "Group":
          g = new Vc;
          break;
        default:
          g = new E
      }
      g.uuid = a.uuid;
      void 0 !== a.name && (g.name = a.name);
      void 0 !== a.matrix ? (g.matrix.fromArray(a.matrix), void 0 !== a.matrixAutoUpdate && (g.matrixAutoUpdate = a.matrixAutoUpdate), g.matrixAutoUpdate && g.matrix.decompose(g.position, g.quaternion, g.scale)) : (void 0 !== a.position && g.position.fromArray(a.position), void 0 !== a.rotation && g.rotation.fromArray(a.rotation), void 0 !== a.quaternion && g.quaternion.fromArray(a.quaternion),
        void 0 !== a.scale && g.scale.fromArray(a.scale));
      void 0 !== a.castShadow && (g.castShadow = a.castShadow);
      void 0 !== a.receiveShadow && (g.receiveShadow = a.receiveShadow);
      a.shadow && (void 0 !== a.shadow.bias && (g.shadow.bias = a.shadow.bias), void 0 !== a.shadow.radius && (g.shadow.radius = a.shadow.radius), void 0 !== a.shadow.mapSize && g.shadow.mapSize.fromArray(a.shadow.mapSize), void 0 !== a.shadow.camera && (g.shadow.camera = this.parseObject(a.shadow.camera)));
      void 0 !== a.visible && (g.visible = a.visible);
      void 0 !== a.frustumCulled &&
        (g.frustumCulled = a.frustumCulled);
      void 0 !== a.renderOrder && (g.renderOrder = a.renderOrder);
      void 0 !== a.userData && (g.userData = a.userData);
      void 0 !== a.layers && (g.layers.mask = a.layers);
      void 0 !== a.drawMode && g.setDrawMode(a.drawMode);
      if (void 0 !== a.children)
        for (m = a.children, k = 0; k < m.length; k++) g.add(this.parseObject(m[k], b, c));
      if ("LOD" === a.type)
        for (a = a.levels, m = 0; m < a.length; m++) {
          k = a[m];
          var l = g.getObjectByProperty("uuid", k.object);
          void 0 !== l && g.addLevel(l, k.distance)
        }
      return g
    }
  });
  var Ol = {
      UVMapping: 300,
      CubeReflectionMapping: 301,
      CubeRefractionMapping: 302,
      EquirectangularReflectionMapping: 303,
      EquirectangularRefractionMapping: 304,
      SphericalReflectionMapping: 305,
      CubeUVReflectionMapping: 306,
      CubeUVRefractionMapping: 307
    },
    yj = {
      RepeatWrapping: 1E3,
      ClampToEdgeWrapping: 1001,
      MirroredRepeatWrapping: 1002
    },
    zj = {
      NearestFilter: 1003,
      NearestMipmapNearestFilter: 1004,
      NearestMipmapLinearFilter: 1005,
      LinearFilter: 1006,
      LinearMipmapNearestFilter: 1007,
      LinearMipmapLinearFilter: 1008
    };
  Tg.prototype = Object.assign(Object.create(X.prototype), {
    constructor: Tg,
    setOptions: function(a) {
      this.options = a;
      return this
    },
    load: function(a, b, c, d) {
      void 0 === a && (a = "");
      void 0 !== this.path && (a = this.path + a);
      a = this.manager.resolveURL(a);
      var f = this,
        g = Fc.get(a);
      if (void 0 !== g) return f.manager.itemStart(a), setTimeout(function() {
        b && b(g);
        f.manager.itemEnd(a)
      }, 0), g;
      fetch(a).then(function(a) {
        return a.blob()
      }).then(function(a) {
        return void 0 === f.options ? createImageBitmap(a) : createImageBitmap(a, f.options)
      }).then(function(c) {
        Fc.add(a, c);
        b && b(c);
        f.manager.itemEnd(a)
      }).catch(function(b) {
        d &&
          d(b);
        f.manager.itemError(a);
        f.manager.itemEnd(a)
      });
      f.manager.itemStart(a)
    }
  });
  Object.assign(Ug.prototype, {
    moveTo: function(a, b) {
      this.currentPath = new ab;
      this.subPaths.push(this.currentPath);
      this.currentPath.moveTo(a, b);
      return this
    },
    lineTo: function(a, b) {
      this.currentPath.lineTo(a, b);
      return this
    },
    quadraticCurveTo: function(a, b, c, d) {
      this.currentPath.quadraticCurveTo(a, b, c, d);
      return this
    },
    bezierCurveTo: function(a, b, c, d, f, g) {
      this.currentPath.bezierCurveTo(a, b, c, d, f, g);
      return this
    },
    splineThru: function(a) {
      this.currentPath.splineThru(a);
      return this
    },
    toShapes: function(a, b) {
      function c(a) {
        for (var b = [], c = 0, d = a.length; c < d; c++) {
          var f = a[c],
            g = new Pb;
          g.curves = f.curves;
          b.push(g)
        }
        return b
      }

      function d(a, b) {
        for (var c = b.length, d = !1, f = c - 1, g = 0; g < c; f = g++) {
          var k = b[f],
            m = b[g],
            l = m.x - k.x,
            n = m.y - k.y;
          if (Math.abs(n) > Number.EPSILON) {
            if (0 > n && (k = b[g], l = -l, m = b[f], n = -n), !(a.y < k.y || a.y > m.y))
              if (a.y === k.y) {
                if (a.x === k.x) return !0
              } else {
                f = n * (a.x - k.x) - l * (a.y - k.y);
                if (0 === f) return !0;
                0 > f || (d = !d)
              }
          } else if (a.y === k.y && (m.x <= a.x && a.x <= k.x || k.x <= a.x && a.x <= m.x)) return !0
        }
        return d
      }
      var f = xb.isClockWise,
        g = this.subPaths;
      if (0 === g.length) return [];
      if (!0 === b) return c(g);
      b = [];
      if (1 === g.length) {
        var k = g[0];
        var m = new Pb;
        m.curves = k.curves;
        b.push(m);
        return b
      }
      var l = !f(g[0].getPoints());
      l = a ? !l : l;
      m = [];
      var p = [],
        q = [],
        t = 0;
      p[t] = void 0;
      q[t] = [];
      for (var r = 0, u = g.length; r < u; r++) {
        k = g[r];
        var v = k.getPoints();
        var w = f(v);
        (w = a ? !w : w) ? (!l && p[t] && t++, p[t] = {
          s: new Pb,
          p: v
        }, p[t].s.curves = k.curves, l && t++, q[t] = []) : q[t].push({
          h: k,
          p: v[0]
        })
      }
      if (!p[0]) return c(g);
      if (1 < p.length) {
        r = !1;
        a = [];
        f = 0;
        for (g = p.length; f < g; f++) m[f] = [];
        f = 0;
        for (g = p.length; f < g; f++)
          for (k = q[f], w = 0; w < k.length; w++) {
            l = k[w];
            t = !0;
            for (v = 0; v < p.length; v++) d(l.p, p[v].p) && (f !== v && a.push({
              froms: f,
              tos: v,
              hole: w
            }), t ? (t = !1, m[v].push(l)) : r = !0);
            t && m[f].push(l)
          }
        0 < a.length && (r || (q = m))
      }
      r = 0;
      for (f = p.length; r < f; r++)
        for (m = p[r].s, b.push(m), a = q[r], g = 0, k = a.length; g < k; g++) m.holes.push(a[g].h);
      return b
    }
  });
  Object.assign(Vg.prototype, {
    isFont: !0,
    generateShapes: function(a, b) {
      void 0 === b && (b = 100);
      var c = [],
        d = b;
      b = this.data;
      var f = Array.from ? Array.from(a) : String(a).split("");
      d /= b.resolution;
      var g = (b.boundingBox.yMax - b.boundingBox.yMin + b.underlineThickness) * d;
      a = [];
      for (var k = 0, m = 0, l = 0; l < f.length; l++) {
        var p = f[l];
        if ("\n" === p) k = 0, m -= g;
        else {
          var q = p;
          p = d;
          var t = k,
            r = m,
            u = b,
            v = u.glyphs[q] || u.glyphs["?"];
          if (v) {
            q = new Ug;
            if (v.o) {
              u = v._cachedOutline || (v._cachedOutline = v.o.split(" "));
              for (var w = 0, x = u.length; w < x;) switch (u[w++]) {
                case "m":
                  var B = u[w++] * p + t;
                  var z = u[w++] * p + r;
                  q.moveTo(B, z);
                  break;
                case "l":
                  B = u[w++] * p + t;
                  z = u[w++] * p + r;
                  q.lineTo(B, z);
                  break;
                case "q":
                  var A = u[w++] * p + t;
                  var D = u[w++] * p + r;
                  var E = u[w++] * p + t;
                  var F = u[w++] * p + r;
                  q.quadraticCurveTo(E, F, A, D);
                  break;
                case "b":
                  A = u[w++] * p + t, D = u[w++] * p + r, E = u[w++] * p + t, F = u[w++] * p + r, B = u[w++] * p + t, z = u[w++] * p + r, q.bezierCurveTo(E, F, B, z, A, D)
              }
            }
            p = {
              offsetX: v.ha * p,
              path: q
            }
          } else console.error('THREE.Font: character "' + q + '" does not exists in font family ' + u.familyName + "."), p = void 0;
          k += p.offsetX;
          a.push(p.path)
        }
      }
      b = 0;
      for (f = a.length; b < f; b++) Array.prototype.push.apply(c, a[b].toShapes());
      return c
    }
  });
  Wg.prototype = Object.assign(Object.create(X.prototype), {
    constructor: Wg,
    load: function(a,
      b, c, d) {
      var f = this,
        g = new Qa(this.manager);
      g.setPath(this.path);
      g.load(a, function(a) {
        try {
          var c = JSON.parse(a)
        } catch (n) {
          console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."), c = JSON.parse(a.substring(65, a.length - 2))
        }
        a = f.parse(c);
        b && b(a)
      }, c, d)
    },
    parse: function(a) {
      return new Vg(a)
    }
  });
  var gg, ah = {
    getContext: function() {
      void 0 === gg && (gg = new null);
      return gg
    },
    setContext: function(a) {
      gg = a
    }
  };
  Ff.prototype = Object.assign(Object.create(X.prototype), {
    constructor: Ff,
    load: function(a,
      b, c, d) {
      var f = new Qa(this.manager);
      f.setResponseType("arraybuffer");
      f.setPath(this.path);
      f.load(a, function(a) {
        a = a.slice(0);
        ah.getContext().decodeAudioData(a, function(a) {
          b(a)
        })
      }, c, d)
    }
  });
  Object.assign(Gf.prototype, {
    isSphericalHarmonics3: !0,
    set: function(a) {
      for (var b = 0; 9 > b; b++) this.coefficients[b].copy(a[b]);
      return this
    },
    zero: function() {
      for (var a = 0; 9 > a; a++) this.coefficients[a].set(0, 0, 0);
      return this
    },
    getAt: function(a, b) {
      var c = a.x,
        d = a.y;
      a = a.z;
      var f = this.coefficients;
      b.copy(f[0]).multiplyScalar(.282095);
      b.addScale(f[1], .488603 * d);
      b.addScale(f[2], .488603 * a);
      b.addScale(f[3], .488603 * c);
      b.addScale(f[4], 1.092548 * c * d);
      b.addScale(f[5], 1.092548 * d * a);
      b.addScale(f[6], .315392 * (3 * a * a - 1));
      b.addScale(f[7], 1.092548 * c * a);
      b.addScale(f[8], .546274 * (c * c - d * d));
      return b
    },
    getIrradianceAt: function(a, b) {
      var c = a.x,
        d = a.y;
      a = a.z;
      var f = this.coefficients;
      b.copy(f[0]).multiplyScalar(.886227);
      b.addScale(f[1], 1.023328 * d);
      b.addScale(f[2], 1.023328 * a);
      b.addScale(f[3], 1.023328 * c);
      b.addScale(f[4], .858086 * c * d);
      b.addScale(f[5], .858086 *
        d * a);
      b.addScale(f[6], .743125 * a * a - .247708);
      b.addScale(f[7], .858086 * c * a);
      b.addScale(f[8], .429043 * (c * c - d * d));
      return b
    },
    add: function(a) {
      for (var b = 0; 9 > b; b++) this.coefficients[b].add(a.coefficients[b]);
      return this
    },
    scale: function(a) {
      for (var b = 0; 9 > b; b++) this.coefficients[b].multiplyScalar(a);
      return this
    },
    lerp: function(a, b) {
      for (var c = 0; 9 > c; c++) this.coefficients[c].lerp(a.coefficients[c], b);
      return this
    },
    equals: function(a) {
      for (var b = 0; 9 > b; b++)
        if (!this.coefficients[b].equals(a.coefficients[b])) return !1;
      return !0
    },
    copy: function(a) {
      return this.set(a.coefficients)
    },
    clone: function() {
      return (new this.constructor).copy(this)
    },
    fromArray: function(a, b) {
      void 0 === b && (b = 0);
      for (var c = this.coefficients, d = 0; 9 > d; d++) c[d].fromArray(a, b + 3 * d);
      return this
    },
    toArray: function(a, b) {
      void 0 === a && (a = []);
      void 0 === b && (b = 0);
      for (var c = this.coefficients, d = 0; 9 > d; d++) c[d].toArray(a, b + 3 * d);
      return a
    }
  });
  Object.assign(Gf, {
    getBasisAt: function(a, b) {
      var c = a.x,
        d = a.y;
      a = a.z;
      b[0] = .282095;
      b[1] = .488603 * d;
      b[2] = .488603 * a;
      b[3] = .488603 * c;
      b[4] = 1.092548 * c * d;
      b[5] = 1.092548 * d * a;
      b[6] = .315392 * (3 * a * a - 1);
      b[7] = 1.092548 * c * a;
      b[8] = .546274 * (c * c - d * d)
    }
  });
  bb.prototype = Object.assign(Object.create(da.prototype), {
    constructor: bb,
    isLightProbe: !0,
    copy: function(a) {
      da.prototype.copy.call(this, a);
      this.sh.copy(a.sh);
      this.intensity = a.intensity;
      return this
    },
    toJSON: function(a) {
      return da.prototype.toJSON.call(this, a)
    }
  });
  Xg.prototype = Object.assign(Object.create(bb.prototype), {
    constructor: Xg,
    isHemisphereLightProbe: !0,
    copy: function(a) {
      bb.prototype.copy.call(this, a);
      return this
    },
    toJSON: function(a) {
      return bb.prototype.toJSON.call(this,
        a)
    }
  });
  Yg.prototype = Object.assign(Object.create(bb.prototype), {
    constructor: Yg,
    isAmbientLightProbe: !0,
    copy: function(a) {
      bb.prototype.copy.call(this, a);
      return this
    },
    toJSON: function(a) {
      return bb.prototype.toJSON.call(this, a)
    }
  });
  var Aj = new I,
    Bj = new I;
  Object.assign(Ni.prototype, {
    update: function(a) {
      var b = this._cache;
      if (b.focus !== a.focus || b.fov !== a.fov || b.aspect !== a.aspect * this.aspect || b.near !== a.near || b.far !== a.far || b.zoom !== a.zoom || b.eyeSep !== this.eyeSep) {
        b.focus = a.focus;
        b.fov = a.fov;
        b.aspect = a.aspect * this.aspect;
        b.near = a.near;
        b.far = a.far;
        b.zoom = a.zoom;
        b.eyeSep = this.eyeSep;
        var c = a.projectionMatrix.clone(),
          d = b.eyeSep / 2,
          f = d * b.near / b.focus,
          g = b.near * Math.tan(N.DEG2RAD * b.fov * .5) / b.zoom;
        Bj.elements[12] = -d;
        Aj.elements[12] = d;
        d = -g * b.aspect + f;
        var k = g * b.aspect + f;
        c.elements[0] = 2 * b.near / (k - d);
        c.elements[8] = (k + d) / (k - d);
        this.cameraL.projectionMatrix.copy(c);
        d = -g * b.aspect - f;
        k = g * b.aspect - f;
        c.elements[0] = 2 * b.near / (k - d);
        c.elements[8] = (k + d) / (k - d);
        this.cameraR.projectionMatrix.copy(c)
      }
      this.cameraL.matrixWorld.copy(a.matrixWorld).multiply(Bj);
      this.cameraR.matrixWorld.copy(a.matrixWorld).multiply(Aj)
    }
  });
  Object.assign(Zg.prototype, {
    start: function() {
      this.oldTime = this.startTime = ("undefined" === typeof performance ? Date : performance).now();
      this.elapsedTime = 0;
      this.running = !0
    },
    stop: function() {
      this.getElapsedTime();
      this.autoStart = this.running = !1
    },
    getElapsedTime: function() {
      this.getDelta();
      return this.elapsedTime
    },
    getDelta: function() {
      var a = 0;
      if (this.autoStart && !this.running) return this.start(), 0;
      if (this.running) {
        var b = ("undefined" === typeof performance ?
          Date : performance).now();
        a = (b - this.oldTime) / 1E3;
        this.oldTime = b;
        this.elapsedTime += a
      }
      return a
    }
  });
  var Gc = new q,
    Cj = new ya,
    Pl = new q,
    Hc = new q;
  $g.prototype = Object.assign(Object.create(E.prototype), {
    constructor: $g,
    getInput: function() {
      return this.gain
    },
    removeFilter: function() {
      null !== this.filter && (this.gain.disconnect(this.filter), this.filter.disconnect(this.context.destination), this.gain.connect(this.context.destination), this.filter = null);
      return this
    },
    getFilter: function() {
      return this.filter
    },
    setFilter: function(a) {
      null !==
        this.filter ? (this.gain.disconnect(this.filter), this.filter.disconnect(this.context.destination)) : this.gain.disconnect(this.context.destination);
      this.filter = a;
      this.gain.connect(this.filter);
      this.filter.connect(this.context.destination);
      return this
    },
    getMasterVolume: function() {
      return this.gain.gain.value
    },
    setMasterVolume: function(a) {
      this.gain.gain.setTargetAtTime(a, this.context.currentTime, .01);
      return this
    },
    updateMatrixWorld: function(a) {
      E.prototype.updateMatrixWorld.call(this, a);
      a = this.context.listener;
      var b = this.up;
      this.timeDelta = this._clock.getDelta();
      this.matrixWorld.decompose(Gc, Cj, Pl);
      Hc.set(0, 0, -1).applyQuaternion(Cj);
      if (a.positionX) {
        var c = this.context.currentTime + this.timeDelta;
        a.positionX.linearRampToValueAtTime(Gc.x, c);
        a.positionY.linearRampToValueAtTime(Gc.y, c);
        a.positionZ.linearRampToValueAtTime(Gc.z, c);
        a.forwardX.linearRampToValueAtTime(Hc.x, c);
        a.forwardY.linearRampToValueAtTime(Hc.y, c);
        a.forwardZ.linearRampToValueAtTime(Hc.z, c);
        a.upX.linearRampToValueAtTime(b.x, c);
        a.upY.linearRampToValueAtTime(b.y,
          c);
        a.upZ.linearRampToValueAtTime(b.z, c)
      } else a.setPosition(Gc.x, Gc.y, Gc.z), a.setOrientation(Hc.x, Hc.y, Hc.z, b.x, b.y, b.z)
    }
  });
  rd.prototype = Object.assign(Object.create(E.prototype), {
    constructor: rd,
    getOutput: function() {
      return this.gain
    },
    setNodeSource: function(a) {
      this.hasPlaybackControl = !1;
      this.sourceType = "audioNode";
      this.source = a;
      this.connect();
      return this
    },
    setMediaElementSource: function(a) {
      this.hasPlaybackControl = !1;
      this.sourceType = "mediaNode";
      this.source = this.context.createMediaElementSource(a);
      this.connect();
      return this
    },
    setMediaStreamSource: function(a) {
      this.hasPlaybackControl = !1;
      this.sourceType = "mediaStreamNode";
      this.source = this.context.createMediaStreamSource(a);
      this.connect();
      return this
    },
    setBuffer: function(a) {
      this.buffer = a;
      this.sourceType = "buffer";
      this.autoplay && this.play();
      return this
    },
    play: function(a) {
      void 0 === a && (a = 0);
      if (!0 === this.isPlaying) console.warn("THREE.Audio: Audio is already playing.");
      else if (!1 === this.hasPlaybackControl) console.warn("THREE.Audio: this Audio has no playback control.");
      else return this._startedAt = this.context.currentTime + a, a = this.context.createBufferSource(), a.buffer = this.buffer, a.loop = this.loop, a.loopStart = this.loopStart, a.loopEnd = this.loopEnd, a.onended = this.onEnded.bind(this), a.start(this._startedAt, this._pausedAt + this.offset, this.duration), this.isPlaying = !0, this.source = a, this.setDetune(this.detune), this.setPlaybackRate(this.playbackRate), this.connect()
    },
    pause: function() {
      if (!1 === this.hasPlaybackControl) console.warn("THREE.Audio: this Audio has no playback control.");
      else return !0 === this.isPlaying && (this._pausedAt = (this.context.currentTime - this._startedAt) * this.playbackRate, this.source.stop(), this.source.onended = null, this.isPlaying = !1), this
    },
    stop: function() {
      if (!1 === this.hasPlaybackControl) console.warn("THREE.Audio: this Audio has no playback control.");
      else return this._pausedAt = 0, this.source.stop(), this.source.onended = null, this.isPlaying = !1, this
    },
    connect: function() {
      if (0 < this.filters.length) {
        this.source.connect(this.filters[0]);
        for (var a = 1, b = this.filters.length; a <
          b; a++) this.filters[a - 1].connect(this.filters[a]);
        this.filters[this.filters.length - 1].connect(this.getOutput())
      } else this.source.connect(this.getOutput());
      return this
    },
    disconnect: function() {
      if (0 < this.filters.length) {
        this.source.disconnect(this.filters[0]);
        for (var a = 1, b = this.filters.length; a < b; a++) this.filters[a - 1].disconnect(this.filters[a]);
        this.filters[this.filters.length - 1].disconnect(this.getOutput())
      } else this.source.disconnect(this.getOutput());
      return this
    },
    getFilters: function() {
      return this.filters
    },
    setFilters: function(a) {
      a || (a = []);
      !0 === this.isPlaying ? (this.disconnect(), this.filters = a, this.connect()) : this.filters = a;
      return this
    },
    setDetune: function(a) {
      this.detune = a;
      if (void 0 !== this.source.detune) return !0 === this.isPlaying && this.source.detune.setTargetAtTime(this.detune, this.context.currentTime, .01), this
    },
    getDetune: function() {
      return this.detune
    },
    getFilter: function() {
      return this.getFilters()[0]
    },
    setFilter: function(a) {
      return this.setFilters(a ? [a] : [])
    },
    setPlaybackRate: function(a) {
      if (!1 === this.hasPlaybackControl) console.warn("THREE.Audio: this Audio has no playback control.");
      else return this.playbackRate = a, !0 === this.isPlaying && this.source.playbackRate.setTargetAtTime(this.playbackRate, this.context.currentTime, .01), this
    },
    getPlaybackRate: function() {
      return this.playbackRate
    },
    onEnded: function() {
      this.isPlaying = !1
    },
    getLoop: function() {
      return !1 === this.hasPlaybackControl ? (console.warn("THREE.Audio: this Audio has no playback control."), !1) : this.loop
    },
    setLoop: function(a) {
      if (!1 === this.hasPlaybackControl) console.warn("THREE.Audio: this Audio has no playback control.");
      else return this.loop =
        a, !0 === this.isPlaying && (this.source.loop = this.loop), this
    },
    setLoopStart: function(a) {
      this.loopStart = a;
      return this
    },
    setLoopEnd: function(a) {
      this.loopEnd = a;
      return this
    },
    getVolume: function() {
      return this.gain.gain.value
    },
    setVolume: function(a) {
      this.gain.gain.setTargetAtTime(a, this.context.currentTime, .01);
      return this
    }
  });
  var Ic = new q,
    Dj = new ya,
    Ql = new q,
    Jc = new q;
  bh.prototype = Object.assign(Object.create(rd.prototype), {
    constructor: bh,
    getOutput: function() {
      return this.panner
    },
    getRefDistance: function() {
      return this.panner.refDistance
    },
    setRefDistance: function(a) {
      this.panner.refDistance = a;
      return this
    },
    getRolloffFactor: function() {
      return this.panner.rolloffFactor
    },
    setRolloffFactor: function(a) {
      this.panner.rolloffFactor = a;
      return this
    },
    getDistanceModel: function() {
      return this.panner.distanceModel
    },
    setDistanceModel: function(a) {
      this.panner.distanceModel = a;
      return this
    },
    getMaxDistance: function() {
      return this.panner.maxDistance
    },
    setMaxDistance: function(a) {
      this.panner.maxDistance = a;
      return this
    },
    setDirectionalCone: function(a, b, c) {
      this.panner.coneInnerAngle =
        a;
      this.panner.coneOuterAngle = b;
      this.panner.coneOuterGain = c;
      return this
    },
    updateMatrixWorld: function(a) {
      E.prototype.updateMatrixWorld.call(this, a);
      if (!0 !== this.hasPlaybackControl || !1 !== this.isPlaying)
        if (this.matrixWorld.decompose(Ic, Dj, Ql), Jc.set(0, 0, 1).applyQuaternion(Dj), a = this.panner, a.positionX) {
          var b = this.context.currentTime + this.listener.timeDelta;
          a.positionX.linearRampToValueAtTime(Ic.x, b);
          a.positionY.linearRampToValueAtTime(Ic.y, b);
          a.positionZ.linearRampToValueAtTime(Ic.z, b);
          a.orientationX.linearRampToValueAtTime(Jc.x,
            b);
          a.orientationY.linearRampToValueAtTime(Jc.y, b);
          a.orientationZ.linearRampToValueAtTime(Jc.z, b)
        } else a.setPosition(Ic.x, Ic.y, Ic.z), a.setOrientation(Jc.x, Jc.y, Jc.z)
    }
  });
  Object.assign(ch.prototype, {
    getFrequencyData: function() {
      this.analyser.getByteFrequencyData(this.data);
      return this.data
    },
    getAverageFrequency: function() {
      for (var a = 0, b = this.getFrequencyData(), c = 0; c < b.length; c++) a += b[c];
      return a / b.length
    }
  });
  Object.assign(dh.prototype, {
    accumulate: function(a, b) {
      var c = this.buffer,
        d = this.valueSize;
      a = a * d + d;
      var f = this.cumulativeWeight;
      if (0 === f) {
        for (f = 0; f !== d; ++f) c[a + f] = c[f];
        f = b
      } else f += b, this._mixBufferRegion(c, a, 0, b / f, d);
      this.cumulativeWeight = f
    },
    apply: function(a) {
      var b = this.valueSize,
        c = this.buffer;
      a = a * b + b;
      var d = this.cumulativeWeight,
        f = this.binding;
      this.cumulativeWeight = 0;
      1 > d && this._mixBufferRegion(c, a, 3 * b, 1 - d, b);
      d = b;
      for (var g = b + b; d !== g; ++d)
        if (c[d] !== c[d + b]) {
          f.setValue(c, a);
          break
        }
    },
    saveOriginalState: function() {
      var a = this.buffer,
        b = this.valueSize,
        c = 3 * b;
      this.binding.getValue(a, c);
      for (var d = b; d !== c; ++d) a[d] =
        a[c + d % b];
      this.cumulativeWeight = 0
    },
    restoreOriginalState: function() {
      this.binding.setValue(this.buffer, 3 * this.valueSize)
    },
    _select: function(a, b, c, d, f) {
      if (.5 <= d)
        for (d = 0; d !== f; ++d) a[b + d] = a[c + d]
    },
    _slerp: function(a, b, c, d) {
      ya.slerpFlat(a, b, a, b, a, c, d)
    },
    _lerp: function(a, b, c, d, f) {
      for (var g = 1 - d, k = 0; k !== f; ++k) {
        var m = b + k;
        a[m] = a[m] * g + a[c + k] * d
      }
    }
  });
  var Rl = /[\[\]\.:\/]/g,
    Sl = "[^" + "\\[\\]\\.:\\/".replace("\\.", "") + "]",
    Tl = /((?:WC+[\/:])*)/.source.replace("WC", "[^\\[\\]\\.:\\/]"),
    Ul = /(WCOD+)?/.source.replace("WCOD", Sl),
    Vl = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC", "[^\\[\\]\\.:\\/]"),
    Wl = /\.(WC+)(?:\[(.+)\])?/.source.replace("WC", "[^\\[\\]\\.:\\/]"),
    Xl = new RegExp("^" + Tl + Ul + Vl + Wl + "$"),
    Yl = ["material", "materials", "bones"];
  Object.assign(Oi.prototype, {
    getValue: function(a, b) {
      this.bind();
      var c = this._bindings[this._targetGroup.nCachedObjects_];
      void 0 !== c && c.getValue(a, b)
    },
    setValue: function(a, b) {
      for (var c = this._bindings, d = this._targetGroup.nCachedObjects_, f = c.length; d !== f; ++d) c[d].setValue(a, b)
    },
    bind: function() {
      for (var a =
          this._bindings, b = this._targetGroup.nCachedObjects_, c = a.length; b !== c; ++b) a[b].bind()
    },
    unbind: function() {
      for (var a = this._bindings, b = this._targetGroup.nCachedObjects_, c = a.length; b !== c; ++b) a[b].unbind()
    }
  });
  Object.assign(ja, {
    Composite: Oi,
    create: function(a, b, c) {
      return a && a.isAnimationObjectGroup ? new ja.Composite(a, b, c) : new ja(a, b, c)
    },
    sanitizeNodeName: function(a) {
      return a.replace(/\s/g, "_").replace(Rl, "")
    },
    parseTrackName: function(a) {
      var b = Xl.exec(a);
      if (!b) throw Error("PropertyBinding: Cannot parse trackName: " +
        a);
      b = {
        nodeName: b[2],
        objectName: b[3],
        objectIndex: b[4],
        propertyName: b[5],
        propertyIndex: b[6]
      };
      var c = b.nodeName && b.nodeName.lastIndexOf(".");
      if (void 0 !== c && -1 !== c) {
        var d = b.nodeName.substring(c + 1); - 1 !== Yl.indexOf(d) && (b.nodeName = b.nodeName.substring(0, c), b.objectName = d)
      }
      if (null === b.propertyName || 0 === b.propertyName.length) throw Error("PropertyBinding: can not parse propertyName from trackName: " + a);
      return b
    },
    findNode: function(a, b) {
      if (!b || "" === b || "root" === b || "." === b || -1 === b || b === a.name || b === a.uuid) return a;
      if (a.skeleton) {
        var c = a.skeleton.getBoneByName(b);
        if (void 0 !== c) return c
      }
      if (a.children) {
        var d = function(a) {
          for (var c = 0; c < a.length; c++) {
            var f = a[c];
            if (f.name === b || f.uuid === b || (f = d(f.children))) return f
          }
          return null
        };
        if (a = d(a.children)) return a
      }
      return null
    }
  });
  Object.assign(ja.prototype, {
    _getValue_unavailable: function() {},
    _setValue_unavailable: function() {},
    BindingType: {
      Direct: 0,
      EntireArray: 1,
      ArrayElement: 2,
      HasFromToArray: 3
    },
    Versioning: {
      None: 0,
      NeedsUpdate: 1,
      MatrixWorldNeedsUpdate: 2
    },
    GetterByBindingType: [function(a,
      b) {
      a[b] = this.node[this.propertyName]
    }, function(a, b) {
      for (var c = this.resolvedProperty, d = 0, f = c.length; d !== f; ++d) a[b++] = c[d]
    }, function(a, b) {
      a[b] = this.resolvedProperty[this.propertyIndex]
    }, function(a, b) {
      this.resolvedProperty.toArray(a, b)
    }],
    SetterByBindingTypeAndVersioning: [
      [function(a, b) {
        this.targetObject[this.propertyName] = a[b]
      }, function(a, b) {
        this.targetObject[this.propertyName] = a[b];
        this.targetObject.needsUpdate = !0
      }, function(a, b) {
        this.targetObject[this.propertyName] = a[b];
        this.targetObject.matrixWorldNeedsUpdate = !0
      }],
      [function(a, b) {
        for (var c = this.resolvedProperty, d = 0, f = c.length; d !== f; ++d) c[d] = a[b++]
      }, function(a, b) {
        for (var c = this.resolvedProperty, d = 0, f = c.length; d !== f; ++d) c[d] = a[b++];
        this.targetObject.needsUpdate = !0
      }, function(a, b) {
        for (var c = this.resolvedProperty, d = 0, f = c.length; d !== f; ++d) c[d] = a[b++];
        this.targetObject.matrixWorldNeedsUpdate = !0
      }],
      [function(a, b) {
        this.resolvedProperty[this.propertyIndex] = a[b]
      }, function(a, b) {
        this.resolvedProperty[this.propertyIndex] = a[b];
        this.targetObject.needsUpdate = !0
      }, function(a,
        b) {
        this.resolvedProperty[this.propertyIndex] = a[b];
        this.targetObject.matrixWorldNeedsUpdate = !0
      }],
      [function(a, b) {
        this.resolvedProperty.fromArray(a, b)
      }, function(a, b) {
        this.resolvedProperty.fromArray(a, b);
        this.targetObject.needsUpdate = !0
      }, function(a, b) {
        this.resolvedProperty.fromArray(a, b);
        this.targetObject.matrixWorldNeedsUpdate = !0
      }]
    ],
    getValue: function(a, b) {
      this.bind();
      this.getValue(a, b)
    },
    setValue: function(a, b) {
      this.bind();
      this.setValue(a, b)
    },
    bind: function() {
      var a = this.node,
        b = this.parsedPath,
        c = b.objectName,
        d = b.propertyName,
        f = b.propertyIndex;
      a || (this.node = a = ja.findNode(this.rootNode, b.nodeName) || this.rootNode);
      this.getValue = this._getValue_unavailable;
      this.setValue = this._setValue_unavailable;
      if (a) {
        if (c) {
          var g = b.objectIndex;
          switch (c) {
            case "materials":
              if (!a.material) {
                console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.", this);
                return
              }
              if (!a.material.materials) {
                console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.",
                  this);
                return
              }
              a = a.material.materials;
              break;
            case "bones":
              if (!a.skeleton) {
                console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.", this);
                return
              }
              a = a.skeleton.bones;
              for (c = 0; c < a.length; c++)
                if (a[c].name === g) {
                  g = c;
                  break
                }
              break;
            default:
              if (void 0 === a[c]) {
                console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.", this);
                return
              }
              a = a[c]
          }
          if (void 0 !== g) {
            if (void 0 === a[g]) {
              console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.",
                this, a);
              return
            }
            a = a[g]
          }
        }
        g = a[d];
        if (void 0 === g) console.error("THREE.PropertyBinding: Trying to update property for track: " + b.nodeName + "." + d + " but it wasn't found.", a);
        else {
          b = this.Versioning.None;
          this.targetObject = a;
          void 0 !== a.needsUpdate ? b = this.Versioning.NeedsUpdate : void 0 !== a.matrixWorldNeedsUpdate && (b = this.Versioning.MatrixWorldNeedsUpdate);
          c = this.BindingType.Direct;
          if (void 0 !== f) {
            if ("morphTargetInfluences" === d) {
              if (!a.geometry) {
                console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.",
                  this);
                return
              }
              if (a.geometry.isBufferGeometry) {
                if (!a.geometry.morphAttributes) {
                  console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.", this);
                  return
                }
                for (c = 0; c < this.node.geometry.morphAttributes.position.length; c++)
                  if (a.geometry.morphAttributes.position[c].name === f) {
                    f = c;
                    break
                  }
              } else {
                if (!a.geometry.morphTargets) {
                  console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.",
                    this);
                  return
                }
                for (c = 0; c < this.node.geometry.morphTargets.length; c++)
                  if (a.geometry.morphTargets[c].name === f) {
                    f = c;
                    break
                  }
              }
            }
            c = this.BindingType.ArrayElement;
            this.resolvedProperty = g;
            this.propertyIndex = f
          } else void 0 !== g.fromArray && void 0 !== g.toArray ? (c = this.BindingType.HasFromToArray, this.resolvedProperty = g) : Array.isArray(g) ? (c = this.BindingType.EntireArray, this.resolvedProperty = g) : this.propertyName = d;
          this.getValue = this.GetterByBindingType[c];
          this.setValue = this.SetterByBindingTypeAndVersioning[c][b]
        }
      } else console.error("THREE.PropertyBinding: Trying to update node for track: " +
        this.path + " but it wasn't found.")
    },
    unbind: function() {
      this.node = null;
      this.getValue = this._getValue_unbound;
      this.setValue = this._setValue_unbound
    }
  });
  Object.assign(ja.prototype, {
    _getValue_unbound: ja.prototype.getValue,
    _setValue_unbound: ja.prototype.setValue
  });
  Object.assign(Pi.prototype, {
    isAnimationObjectGroup: !0,
    add: function() {
      for (var a = this._objects, b = a.length, c = this.nCachedObjects_, d = this._indicesByUUID, f = this._paths, g = this._parsedPaths, k = this._bindings, m = k.length, l = void 0, p = 0, q = arguments.length; p !==
        q; ++p) {
        var t = arguments[p],
          r = t.uuid,
          u = d[r];
        if (void 0 === u) {
          u = b++;
          d[r] = u;
          a.push(t);
          r = 0;
          for (var v = m; r !== v; ++r) k[r].push(new ja(t, f[r], g[r]))
        } else if (u < c) {
          l = a[u];
          var w = --c;
          v = a[w];
          d[v.uuid] = u;
          a[u] = v;
          d[r] = w;
          a[w] = t;
          r = 0;
          for (v = m; r !== v; ++r) {
            var x = k[r],
              B = x[u];
            x[u] = x[w];
            void 0 === B && (B = new ja(t, f[r], g[r]));
            x[w] = B
          }
        } else a[u] !== l && console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.")
      }
      this.nCachedObjects_ =
        c
    },
    remove: function() {
      for (var a = this._objects, b = this.nCachedObjects_, c = this._indicesByUUID, d = this._bindings, f = d.length, g = 0, k = arguments.length; g !== k; ++g) {
        var m = arguments[g],
          l = m.uuid,
          p = c[l];
        if (void 0 !== p && p >= b) {
          var q = b++,
            t = a[q];
          c[t.uuid] = p;
          a[p] = t;
          c[l] = q;
          a[q] = m;
          m = 0;
          for (l = f; m !== l; ++m) {
            t = d[m];
            var r = t[p];
            t[p] = t[q];
            t[q] = r
          }
        }
      }
      this.nCachedObjects_ = b
    },
    uncache: function() {
      for (var a = this._objects, b = a.length, c = this.nCachedObjects_, d = this._indicesByUUID, f = this._bindings, g = f.length, k = 0, l = arguments.length; k !== l; ++k) {
        var n =
          arguments[k].uuid,
          p = d[n];
        if (void 0 !== p)
          if (delete d[n], p < c) {
            n = --c;
            var q = a[n],
              t = --b,
              r = a[t];
            d[q.uuid] = p;
            a[p] = q;
            d[r.uuid] = n;
            a[n] = r;
            a.pop();
            q = 0;
            for (r = g; q !== r; ++q) {
              var u = f[q],
                v = u[t];
              u[p] = u[n];
              u[n] = v;
              u.pop()
            }
          } else
            for (t = --b, r = a[t], d[r.uuid] = p, a[p] = r, a.pop(), q = 0, r = g; q !== r; ++q) u = f[q], u[p] = u[t], u.pop()
      }
      this.nCachedObjects_ = c
    },
    subscribe_: function(a, b) {
      var c = this._bindingsIndicesByPath,
        d = c[a],
        f = this._bindings;
      if (void 0 !== d) return f[d];
      var g = this._paths,
        k = this._parsedPaths,
        l = this._objects,
        n = this.nCachedObjects_,
        p = Array(l.length);
      d = f.length;
      c[a] = d;
      g.push(a);
      k.push(b);
      f.push(p);
      c = n;
      for (d = l.length; c !== d; ++c) p[c] = new ja(l[c], a, b);
      return p
    },
    unsubscribe_: function(a) {
      var b = this._bindingsIndicesByPath,
        c = b[a];
      if (void 0 !== c) {
        var d = this._paths,
          f = this._parsedPaths,
          g = this._bindings,
          k = g.length - 1,
          l = g[k];
        b[a[k]] = c;
        g[c] = l;
        g.pop();
        f[c] = f[k];
        f.pop();
        d[c] = d[k];
        d.pop()
      }
    }
  });
  Object.assign(Qi.prototype, {
    play: function() {
      this._mixer._activateAction(this);
      return this
    },
    stop: function() {
      this._mixer._deactivateAction(this);
      return this.reset()
    },
    reset: function() {
      this.paused = !1;
      this.enabled = !0;
      this.time = 0;
      this._loopCount = -1;
      this._startTime = null;
      return this.stopFading().stopWarping()
    },
    isRunning: function() {
      return this.enabled && !this.paused && 0 !== this.timeScale && null === this._startTime && this._mixer._isActiveAction(this)
    },
    isScheduled: function() {
      return this._mixer._isActiveAction(this)
    },
    startAt: function(a) {
      this._startTime = a;
      return this
    },
    setLoop: function(a, b) {
      this.loop = a;
      this.repetitions = b;
      return this
    },
    setEffectiveWeight: function(a) {
      this.weight = a;
      this._effectiveWeight = this.enabled ? a : 0;
      return this.stopFading()
    },
    getEffectiveWeight: function() {
      return this._effectiveWeight
    },
    fadeIn: function(a) {
      return this._scheduleFading(a, 0, 1)
    },
    fadeOut: function(a) {
      return this._scheduleFading(a, 1, 0)
    },
    crossFadeFrom: function(a, b, c) {
      a.fadeOut(b);
      this.fadeIn(b);
      if (c) {
        c = this._clip.duration;
        var d = a._clip.duration,
          f = c / d;
        a.warp(1, d / c, b);
        this.warp(f, 1, b)
      }
      return this
    },
    crossFadeTo: function(a, b, c) {
      return a.crossFadeFrom(this, b, c)
    },
    stopFading: function() {
      var a = this._weightInterpolant;
      null !== a && (this._weightInterpolant = null, this._mixer._takeBackControlInterpolant(a));
      return this
    },
    setEffectiveTimeScale: function(a) {
      this.timeScale = a;
      this._effectiveTimeScale = this.paused ? 0 : a;
      return this.stopWarping()
    },
    getEffectiveTimeScale: function() {
      return this._effectiveTimeScale
    },
    setDuration: function(a) {
      this.timeScale = this._clip.duration / a;
      return this.stopWarping()
    },
    syncWith: function(a) {
      this.time = a.time;
      this.timeScale = a.timeScale;
      return this.stopWarping()
    },
    halt: function(a) {
      return this.warp(this._effectiveTimeScale,
        0, a)
    },
    warp: function(a, b, c) {
      var d = this._mixer,
        f = d.time,
        g = this._timeScaleInterpolant,
        k = this.timeScale;
      null === g && (this._timeScaleInterpolant = g = d._lendControlInterpolant());
      d = g.parameterPositions;
      g = g.sampleValues;
      d[0] = f;
      d[1] = f + c;
      g[0] = a / k;
      g[1] = b / k;
      return this
    },
    stopWarping: function() {
      var a = this._timeScaleInterpolant;
      null !== a && (this._timeScaleInterpolant = null, this._mixer._takeBackControlInterpolant(a));
      return this
    },
    getMixer: function() {
      return this._mixer
    },
    getClip: function() {
      return this._clip
    },
    getRoot: function() {
      return this._localRoot ||
        this._mixer._root
    },
    _update: function(a, b, c, d) {
      if (this.enabled) {
        var f = this._startTime;
        if (null !== f) {
          b = (a - f) * c;
          if (0 > b || 0 === c) return;
          this._startTime = null;
          b *= c
        }
        b *= this._updateTimeScale(a);
        c = this._updateTime(b);
        a = this._updateWeight(a);
        if (0 < a) {
          b = this._interpolants;
          f = this._propertyBindings;
          for (var g = 0, k = b.length; g !== k; ++g) b[g].evaluate(c), f[g].accumulate(d, a)
        }
      } else this._updateWeight(a)
    },
    _updateWeight: function(a) {
      var b = 0;
      if (this.enabled) {
        b = this.weight;
        var c = this._weightInterpolant;
        if (null !== c) {
          var d = c.evaluate(a)[0];
          b *= d;
          a > c.parameterPositions[1] && (this.stopFading(), 0 === d && (this.enabled = !1))
        }
      }
      return this._effectiveWeight = b
    },
    _updateTimeScale: function(a) {
      var b = 0;
      if (!this.paused) {
        b = this.timeScale;
        var c = this._timeScaleInterpolant;
        if (null !== c) {
          var d = c.evaluate(a)[0];
          b *= d;
          a > c.parameterPositions[1] && (this.stopWarping(), 0 === b ? this.paused = !0 : this.timeScale = b)
        }
      }
      return this._effectiveTimeScale = b
    },
    _updateTime: function(a) {
      var b = this.time + a,
        c = this._clip.duration,
        d = this.loop,
        f = this._loopCount,
        g = 2202 === d;
      if (0 === a) return -1 ===
        f ? b : g && 1 === (f & 1) ? c - b : b;
      if (2200 === d) a: {
        if (-1 === f && (this._loopCount = 0, this._setEndings(!0, !0, !1)), b >= c) b = c;
        else if (0 > b) b = 0;
        else {
          this.time = b;
          break a
        }
        this.clampWhenFinished ? this.paused = !0 : this.enabled = !1;this.time = b;this._mixer.dispatchEvent({
          type: "finished",
          action: this,
          direction: 0 > a ? -1 : 1
        })
      }
      else {
        -1 === f && (0 <= a ? (f = 0, this._setEndings(!0, 0 === this.repetitions, g)) : this._setEndings(0 === this.repetitions, !0, g));
        if (b >= c || 0 > b) {
          d = Math.floor(b / c);
          b -= c * d;
          f += Math.abs(d);
          var k = this.repetitions - f;
          0 >= k ? (this.clampWhenFinished ?
            this.paused = !0 : this.enabled = !1, this.time = b = 0 < a ? c : 0, this._mixer.dispatchEvent({
              type: "finished",
              action: this,
              direction: 0 < a ? 1 : -1
            })) : (1 === k ? (a = 0 > a, this._setEndings(a, !a, g)) : this._setEndings(!1, !1, g), this._loopCount = f, this.time = b, this._mixer.dispatchEvent({
            type: "loop",
            action: this,
            loopDelta: d
          }))
        } else this.time = b;
        if (g && 1 === (f & 1)) return c - b
      }
      return b
    },
    _setEndings: function(a, b, c) {
      var d = this._interpolantSettings;
      c ? (d.endingStart = 2401, d.endingEnd = 2401) : (d.endingStart = a ? this.zeroSlopeAtStart ? 2401 : 2400 : 2402, d.endingEnd =
        b ? this.zeroSlopeAtEnd ? 2401 : 2400 : 2402)
    },
    _scheduleFading: function(a, b, c) {
      var d = this._mixer,
        f = d.time,
        g = this._weightInterpolant;
      null === g && (this._weightInterpolant = g = d._lendControlInterpolant());
      d = g.parameterPositions;
      g = g.sampleValues;
      d[0] = f;
      g[0] = b;
      d[1] = f + a;
      g[1] = c;
      return this
    }
  });
  eh.prototype = Object.assign(Object.create(Ra.prototype), {
    constructor: eh,
    _bindAction: function(a, b) {
      var c = a._localRoot || this._root,
        d = a._clip.tracks,
        f = d.length,
        g = a._propertyBindings;
      a = a._interpolants;
      var k = c.uuid,
        l = this._bindingsByRootAndName,
        n = l[k];
      void 0 === n && (n = {}, l[k] = n);
      for (l = 0; l !== f; ++l) {
        var p = d[l],
          q = p.name,
          t = n[q];
        if (void 0 === t) {
          t = g[l];
          if (void 0 !== t) {
            null === t._cacheIndex && (++t.referenceCount, this._addInactiveBinding(t, k, q));
            continue
          }
          t = new dh(ja.create(c, q, b && b._propertyBindings[l].binding.parsedPath), p.ValueTypeName, p.getValueSize());
          ++t.referenceCount;
          this._addInactiveBinding(t, k, q)
        }
        g[l] = t;
        a[l].resultBuffer = t.buffer
      }
    },
    _activateAction: function(a) {
      if (!this._isActiveAction(a)) {
        if (null === a._cacheIndex) {
          var b = (a._localRoot || this._root).uuid,
            c = a._clip.uuid,
            d = this._actionsByClip[c];
          this._bindAction(a, d && d.knownActions[0]);
          this._addInactiveAction(a, c, b)
        }
        b = a._propertyBindings;
        c = 0;
        for (d = b.length; c !== d; ++c) {
          var f = b[c];
          0 === f.useCount++ && (this._lendBinding(f), f.saveOriginalState())
        }
        this._lendAction(a)
      }
    },
    _deactivateAction: function(a) {
      if (this._isActiveAction(a)) {
        for (var b = a._propertyBindings, c = 0, d = b.length; c !== d; ++c) {
          var f = b[c];
          0 === --f.useCount && (f.restoreOriginalState(), this._takeBackBinding(f))
        }
        this._takeBackAction(a)
      }
    },
    _initMemoryManager: function() {
      this._actions = [];
      this._nActiveActions = 0;
      this._actionsByClip = {};
      this._bindings = [];
      this._nActiveBindings = 0;
      this._bindingsByRootAndName = {};
      this._controlInterpolants = [];
      this._nActiveControlInterpolants = 0;
      var a = this;
      this.stats = {
        actions: {
          get total() {
            return a._actions.length
          },
          get inUse() {
            return a._nActiveActions
          }
        },
        bindings: {
          get total() {
            return a._bindings.length
          },
          get inUse() {
            return a._nActiveBindings
          }
        },
        controlInterpolants: {
          get total() {
            return a._controlInterpolants.length
          },
          get inUse() {
            return a._nActiveControlInterpolants
          }
        }
      }
    },
    _isActiveAction: function(a) {
      a = a._cacheIndex;
      return null !== a && a < this._nActiveActions
    },
    _addInactiveAction: function(a, b, c) {
      var d = this._actions,
        f = this._actionsByClip,
        g = f[b];
      void 0 === g ? (g = {
        knownActions: [a],
        actionByRoot: {}
      }, a._byClipCacheIndex = 0, f[b] = g) : (b = g.knownActions, a._byClipCacheIndex = b.length, b.push(a));
      a._cacheIndex = d.length;
      d.push(a);
      g.actionByRoot[c] = a
    },
    _removeInactiveAction: function(a) {
      var b = this._actions,
        c = b[b.length - 1],
        d = a._cacheIndex;
      c._cacheIndex = d;
      b[d] = c;
      b.pop();
      a._cacheIndex = null;
      b = a._clip.uuid;
      c = this._actionsByClip;
      d = c[b];
      var f = d.knownActions,
        g = f[f.length - 1],
        k = a._byClipCacheIndex;
      g._byClipCacheIndex = k;
      f[k] = g;
      f.pop();
      a._byClipCacheIndex = null;
      delete d.actionByRoot[(a._localRoot || this._root).uuid];
      0 === f.length && delete c[b];
      this._removeInactiveBindingsForAction(a)
    },
    _removeInactiveBindingsForAction: function(a) {
      a = a._propertyBindings;
      for (var b = 0, c = a.length; b !== c; ++b) {
        var d = a[b];
        0 === --d.referenceCount && this._removeInactiveBinding(d)
      }
    },
    _lendAction: function(a) {
      var b = this._actions,
        c = a._cacheIndex,
        d = this._nActiveActions++,
        f = b[d];
      a._cacheIndex = d;
      b[d] = a;
      f._cacheIndex = c;
      b[c] = f
    },
    _takeBackAction: function(a) {
      var b = this._actions,
        c = a._cacheIndex,
        d = --this._nActiveActions,
        f = b[d];
      a._cacheIndex = d;
      b[d] = a;
      f._cacheIndex = c;
      b[c] = f
    },
    _addInactiveBinding: function(a, b, c) {
      var d = this._bindingsByRootAndName,
        f = d[b],
        g = this._bindings;
      void 0 === f && (f = {}, d[b] = f);
      f[c] = a;
      a._cacheIndex = g.length;
      g.push(a)
    },
    _removeInactiveBinding: function(a) {
      var b = this._bindings,
        c = a.binding,
        d = c.rootNode.uuid;
      c = c.path;
      var f = this._bindingsByRootAndName,
        g = f[d],
        k = b[b.length - 1];
      a = a._cacheIndex;
      k._cacheIndex = a;
      b[a] = k;
      b.pop();
      delete g[c];
      0 === Object.keys(g).length && delete f[d]
    },
    _lendBinding: function(a) {
      var b = this._bindings,
        c = a._cacheIndex,
        d = this._nActiveBindings++,
        f = b[d];
      a._cacheIndex = d;
      b[d] = a;
      f._cacheIndex = c;
      b[c] = f
    },
    _takeBackBinding: function(a) {
      var b = this._bindings,
        c = a._cacheIndex,
        d = --this._nActiveBindings,
        f = b[d];
      a._cacheIndex = d;
      b[d] = a;
      f._cacheIndex = c;
      b[c] = f
    },
    _lendControlInterpolant: function() {
      var a = this._controlInterpolants,
        b = this._nActiveControlInterpolants++,
        c = a[b];
      void 0 === c && (c = new ze(new Float32Array(2), new Float32Array(2), 1, this._controlInterpolantsResultBuffer), c.__cacheIndex = b, a[b] = c);
      return c
    },
    _takeBackControlInterpolant: function(a) {
      var b = this._controlInterpolants,
        c = a.__cacheIndex,
        d = --this._nActiveControlInterpolants,
        f = b[d];
      a.__cacheIndex = d;
      b[d] = a;
      f.__cacheIndex = c;
      b[c] = f
    },
    _controlInterpolantsResultBuffer: new Float32Array(1),
    clipAction: function(a, b) {
      var c = b || this._root,
        d = c.uuid;
      c = "string" === typeof a ? Pa.findByName(c, a) : a;
      a = null !== c ? c.uuid : a;
      var f =
        this._actionsByClip[a],
        g = null;
      if (void 0 !== f) {
        g = f.actionByRoot[d];
        if (void 0 !== g) return g;
        g = f.knownActions[0];
        null === c && (c = g._clip)
      }
      if (null === c) return null;
      b = new Qi(this, c, b);
      this._bindAction(b, g);
      this._addInactiveAction(b, a, d);
      return b
    },
    existingAction: function(a, b) {
      var c = b || this._root;
      b = c.uuid;
      c = "string" === typeof a ? Pa.findByName(c, a) : a;
      a = this._actionsByClip[c ? c.uuid : a];
      return void 0 !== a ? a.actionByRoot[b] || null : null
    },
    stopAllAction: function() {
      for (var a = this._actions, b = this._nActiveActions, c = this._bindings,
          d = this._nActiveBindings, f = this._nActiveBindings = this._nActiveActions = 0; f !== b; ++f) a[f].reset();
      for (f = 0; f !== d; ++f) c[f].useCount = 0;
      return this
    },
    update: function(a) {
      a *= this.timeScale;
      for (var b = this._actions, c = this._nActiveActions, d = this.time += a, f = Math.sign(a), g = this._accuIndex ^= 1, k = 0; k !== c; ++k) b[k]._update(d, a, f, g);
      a = this._bindings;
      b = this._nActiveBindings;
      for (k = 0; k !== b; ++k) a[k].apply(g);
      return this
    },
    setTime: function(a) {
      for (var b = this.time = 0; b < this._actions.length; b++) this._actions[b].time = 0;
      return this.update(a)
    },
    getRoot: function() {
      return this._root
    },
    uncacheClip: function(a) {
      var b = this._actions;
      a = a.uuid;
      var c = this._actionsByClip,
        d = c[a];
      if (void 0 !== d) {
        d = d.knownActions;
        for (var f = 0, g = d.length; f !== g; ++f) {
          var k = d[f];
          this._deactivateAction(k);
          var l = k._cacheIndex,
            n = b[b.length - 1];
          k._cacheIndex = null;
          k._byClipCacheIndex = null;
          n._cacheIndex = l;
          b[l] = n;
          b.pop();
          this._removeInactiveBindingsForAction(k)
        }
        delete c[a]
      }
    },
    uncacheRoot: function(a) {
      a = a.uuid;
      var b = this._actionsByClip;
      for (d in b) {
        var c = b[d].actionByRoot[a];
        void 0 !== c &&
          (this._deactivateAction(c), this._removeInactiveAction(c))
      }
      var d = this._bindingsByRootAndName[a];
      if (void 0 !== d)
        for (var f in d) a = d[f], a.restoreOriginalState(), this._removeInactiveBinding(a)
    },
    uncacheAction: function(a, b) {
      a = this.existingAction(a, b);
      null !== a && (this._deactivateAction(a), this._removeInactiveAction(a))
    }
  });
  Hf.prototype.clone = function() {
    return new Hf(void 0 === this.value.clone ? this.value : this.value.clone())
  };
  fh.prototype = Object.assign(Object.create(wb.prototype), {
    constructor: fh,
    isInstancedInterleavedBuffer: !0,
    copy: function(a) {
      wb.prototype.copy.call(this, a);
      this.meshPerAttribute = a.meshPerAttribute;
      return this
    }
  });
  Object.assign(Ri.prototype, {
    linePrecision: 1,
    set: function(a, b) {
      this.ray.set(a, b)
    },
    setFromCamera: function(a, b) {
      b && b.isPerspectiveCamera ? (this.ray.origin.setFromMatrixPosition(b.matrixWorld), this.ray.direction.set(a.x, a.y, .5).unproject(b).sub(this.ray.origin).normalize(), this.camera = b) : b && b.isOrthographicCamera ? (this.ray.origin.set(a.x, a.y, (b.near + b.far) / (b.near - b.far)).unproject(b), this.ray.direction.set(0,
        0, -1).transformDirection(b.matrixWorld), this.camera = b) : console.error("THREE.Raycaster: Unsupported camera type.")
    },
    intersectObject: function(a, b, c) {
      c = c || [];
      gh(a, this, c, b);
      c.sort(Si);
      return c
    },
    intersectObjects: function(a, b, c) {
      c = c || [];
      if (!1 === Array.isArray(a)) return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."), c;
      for (var d = 0, f = a.length; d < f; d++) gh(a[d], this, c, b);
      c.sort(Si);
      return c
    }
  });
  Object.assign(Ti.prototype, {
    set: function(a, b, c) {
      this.radius = a;
      this.phi = b;
      this.theta = c;
      return this
    },
    clone: function() {
      return (new this.constructor).copy(this)
    },
    copy: function(a) {
      this.radius = a.radius;
      this.phi = a.phi;
      this.theta = a.theta;
      return this
    },
    makeSafe: function() {
      this.phi = Math.max(1E-6, Math.min(Math.PI - 1E-6, this.phi));
      return this
    },
    setFromVector3: function(a) {
      return this.setFromCartesianCoords(a.x, a.y, a.z)
    },
    setFromCartesianCoords: function(a, b, c) {
      this.radius = Math.sqrt(a * a + b * b + c * c);
      0 === this.radius ? this.phi = this.theta = 0 : (this.theta = Math.atan2(a, c), this.phi = Math.acos(N.clamp(b / this.radius, -1, 1)));
      return this
    }
  });
  Object.assign(Ui.prototype, {
    set: function(a, b, c) {
      this.radius = a;
      this.theta = b;
      this.y = c;
      return this
    },
    clone: function() {
      return (new this.constructor).copy(this)
    },
    copy: function(a) {
      this.radius = a.radius;
      this.theta = a.theta;
      this.y = a.y;
      return this
    },
    setFromVector3: function(a) {
      return this.setFromCartesianCoords(a.x, a.y, a.z)
    },
    setFromCartesianCoords: function(a, b, c) {
      this.radius = Math.sqrt(a * a + c * c);
      this.theta = Math.atan2(a, c);
      this.y = b;
      return this
    }
  });
  var Ej = new z;
  Object.assign(hh.prototype, {
    set: function(a, b) {
      this.min.copy(a);
      this.max.copy(b);
      return this
    },
    setFromPoints: function(a) {
      this.makeEmpty();
      for (var b = 0, c = a.length; b < c; b++) this.expandByPoint(a[b]);
      return this
    },
    setFromCenterAndSize: function(a, b) {
      b = Ej.copy(b).multiplyScalar(.5);
      this.min.copy(a).sub(b);
      this.max.copy(a).add(b);
      return this
    },
    clone: function() {
      return (new this.constructor).copy(this)
    },
    copy: function(a) {
      this.min.copy(a.min);
      this.max.copy(a.max);
      return this
    },
    makeEmpty: function() {
      this.min.x = this.min.y = Infinity;
      this.max.x = this.max.y = -Infinity;
      return this
    },
    isEmpty: function() {
      return this.max.x <
        this.min.x || this.max.y < this.min.y
    },
    getCenter: function(a) {
      void 0 === a && (console.warn("THREE.Box2: .getCenter() target is now required"), a = new z);
      return this.isEmpty() ? a.set(0, 0) : a.addVectors(this.min, this.max).multiplyScalar(.5)
    },
    getSize: function(a) {
      void 0 === a && (console.warn("THREE.Box2: .getSize() target is now required"), a = new z);
      return this.isEmpty() ? a.set(0, 0) : a.subVectors(this.max, this.min)
    },
    expandByPoint: function(a) {
      this.min.min(a);
      this.max.max(a);
      return this
    },
    expandByVector: function(a) {
      this.min.sub(a);
      this.max.add(a);
      return this
    },
    expandByScalar: function(a) {
      this.min.addScalar(-a);
      this.max.addScalar(a);
      return this
    },
    containsPoint: function(a) {
      return a.x < this.min.x || a.x > this.max.x || a.y < this.min.y || a.y > this.max.y ? !1 : !0
    },
    containsBox: function(a) {
      return this.min.x <= a.min.x && a.max.x <= this.max.x && this.min.y <= a.min.y && a.max.y <= this.max.y
    },
    getParameter: function(a, b) {
      void 0 === b && (console.warn("THREE.Box2: .getParameter() target is now required"), b = new z);
      return b.set((a.x - this.min.x) / (this.max.x - this.min.x),
        (a.y - this.min.y) / (this.max.y - this.min.y))
    },
    intersectsBox: function(a) {
      return a.max.x < this.min.x || a.min.x > this.max.x || a.max.y < this.min.y || a.min.y > this.max.y ? !1 : !0
    },
    clampPoint: function(a, b) {
      void 0 === b && (console.warn("THREE.Box2: .clampPoint() target is now required"), b = new z);
      return b.copy(a).clamp(this.min, this.max)
    },
    distanceToPoint: function(a) {
      return Ej.copy(a).clamp(this.min, this.max).sub(a).length()
    },
    intersect: function(a) {
      this.min.max(a.min);
      this.max.min(a.max);
      return this
    },
    union: function(a) {
      this.min.min(a.min);
      this.max.max(a.max);
      return this
    },
    translate: function(a) {
      this.min.add(a);
      this.max.add(a);
      return this
    },
    equals: function(a) {
      return a.min.equals(this.min) && a.max.equals(this.max)
    }
  });
  var Fj = new q,
    hg = new q;
  Object.assign(ih.prototype, {
    set: function(a, b) {
      this.start.copy(a);
      this.end.copy(b);
      return this
    },
    clone: function() {
      return (new this.constructor).copy(this)
    },
    copy: function(a) {
      this.start.copy(a.start);
      this.end.copy(a.end);
      return this
    },
    getCenter: function(a) {
      void 0 === a && (console.warn("THREE.Line3: .getCenter() target is now required"),
        a = new q);
      return a.addVectors(this.start, this.end).multiplyScalar(.5)
    },
    delta: function(a) {
      void 0 === a && (console.warn("THREE.Line3: .delta() target is now required"), a = new q);
      return a.subVectors(this.end, this.start)
    },
    distanceSq: function() {
      return this.start.distanceToSquared(this.end)
    },
    distance: function() {
      return this.start.distanceTo(this.end)
    },
    at: function(a, b) {
      void 0 === b && (console.warn("THREE.Line3: .at() target is now required"), b = new q);
      return this.delta(b).multiplyScalar(a).add(this.start)
    },
    closestPointToPointParameter: function(a,
      b) {
      Fj.subVectors(a, this.start);
      hg.subVectors(this.end, this.start);
      a = hg.dot(hg);
      a = hg.dot(Fj) / a;
      b && (a = N.clamp(a, 0, 1));
      return a
    },
    closestPointToPoint: function(a, b, c) {
      a = this.closestPointToPointParameter(a, b);
      void 0 === c && (console.warn("THREE.Line3: .closestPointToPoint() target is now required"), c = new q);
      return this.delta(c).multiplyScalar(a).add(this.start)
    },
    applyMatrix4: function(a) {
      this.start.applyMatrix4(a);
      this.end.applyMatrix4(a);
      return this
    },
    equals: function(a) {
      return a.start.equals(this.start) && a.end.equals(this.end)
    }
  });
  Ee.prototype = Object.create(E.prototype);
  Ee.prototype.constructor = Ee;
  Ee.prototype.isImmediateRenderObject = !0;
  var rb = new q,
    Hb = new q,
    Mh = new ka,
    Zl = ["a", "b", "c"];
  Fe.prototype = Object.create(Z.prototype);
  Fe.prototype.constructor = Fe;
  Fe.prototype.update = function() {
    this.object.updateMatrixWorld(!0);
    Mh.getNormalMatrix(this.object.matrixWorld);
    var a = this.object.matrixWorld,
      b = this.geometry.attributes.position,
      c = this.object.geometry;
    if (c && c.isGeometry)
      for (var d = c.vertices, f = c.faces, g = c = 0, k = f.length; g < k; g++)
        for (var l =
            f[g], n = 0, p = l.vertexNormals.length; n < p; n++) {
          var q = l.vertexNormals[n];
          rb.copy(d[l[Zl[n]]]).applyMatrix4(a);
          Hb.copy(q).applyMatrix3(Mh).normalize().multiplyScalar(this.size).add(rb);
          b.setXYZ(c, rb.x, rb.y, rb.z);
          c += 1;
          b.setXYZ(c, Hb.x, Hb.y, Hb.z);
          c += 1
        } else if (c && c.isBufferGeometry)
          for (d = c.attributes.position, f = c.attributes.normal, n = c = 0, p = d.count; n < p; n++) rb.set(d.getX(n), d.getY(n), d.getZ(n)).applyMatrix4(a), Hb.set(f.getX(n), f.getY(n), f.getZ(n)), Hb.applyMatrix3(Mh).normalize().multiplyScalar(this.size).add(rb),
            b.setXYZ(c, rb.x, rb.y, rb.z), c += 1, b.setXYZ(c, Hb.x, Hb.y, Hb.z), c += 1;
    b.needsUpdate = !0
  };
  var Gj = new q;
  sd.prototype = Object.create(E.prototype);
  sd.prototype.constructor = sd;
  sd.prototype.dispose = function() {
    this.cone.geometry.dispose();
    this.cone.material.dispose()
  };
  sd.prototype.update = function() {
    this.light.updateMatrixWorld();
    var a = this.light.distance ? this.light.distance : 1E3,
      b = a * Math.tan(this.light.angle);
    this.cone.scale.set(b, b, a);
    Gj.setFromMatrixPosition(this.light.target.matrixWorld);
    this.cone.lookAt(Gj);
    void 0 !== this.color ? this.cone.material.color.set(this.color) : this.cone.material.color.copy(this.light.color)
  };
  var Vb = new q,
    ig = new I,
    Nh = new I;
  td.prototype = Object.create(Z.prototype);
  td.prototype.constructor = td;
  td.prototype.updateMatrixWorld = function(a) {
    var b = this.bones,
      c = this.geometry,
      d = c.getAttribute("position");
    Nh.getInverse(this.root.matrixWorld);
    for (var f = 0, g = 0; f < b.length; f++) {
      var k = b[f];
      k.parent && k.parent.isBone && (ig.multiplyMatrices(Nh, k.matrixWorld), Vb.setFromMatrixPosition(ig), d.setXYZ(g, Vb.x,
        Vb.y, Vb.z), ig.multiplyMatrices(Nh, k.parent.matrixWorld), Vb.setFromMatrixPosition(ig), d.setXYZ(g + 1, Vb.x, Vb.y, Vb.z), g += 2)
    }
    c.getAttribute("position").needsUpdate = !0;
    E.prototype.updateMatrixWorld.call(this, a)
  };
  ud.prototype = Object.create(ia.prototype);
  ud.prototype.constructor = ud;
  ud.prototype.dispose = function() {
    this.geometry.dispose();
    this.material.dispose()
  };
  ud.prototype.update = function() {
    void 0 !== this.color ? this.material.color.set(this.color) : this.material.color.copy(this.light.color)
  };
  vd.prototype = Object.create(pa.prototype);
  vd.prototype.constructor = vd;
  vd.prototype.update = function() {
    this.scale.set(.5 * this.light.width, .5 * this.light.height, 1);
    if (void 0 !== this.color) this.material.color.set(this.color), this.children[0].material.color.set(this.color);
    else {
      this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);
      var a = this.material.color,
        b = Math.max(a.r, a.g, a.b);
      1 < b && a.multiplyScalar(1 / b);
      this.children[0].material.color.copy(this.material.color)
    }
  };
  vd.prototype.dispose = function() {
    this.geometry.dispose();
    this.material.dispose();
    this.children[0].geometry.dispose();
    this.children[0].material.dispose()
  };
  var $l = new q,
    Hj = new D,
    Ij = new D;
  wd.prototype = Object.create(E.prototype);
  wd.prototype.constructor = wd;
  wd.prototype.dispose = function() {
    this.children[0].geometry.dispose();
    this.children[0].material.dispose()
  };
  wd.prototype.update = function() {
    var a = this.children[0];
    if (void 0 !== this.color) this.material.color.set(this.color);
    else {
      var b = a.geometry.getAttribute("color");
      Hj.copy(this.light.color);
      Ij.copy(this.light.groundColor);
      for (var c = 0, d = b.count; c < d; c++) {
        var f = c < d / 2 ? Hj : Ij;
        b.setXYZ(c, f.r, f.g, f.b)
      }
      b.needsUpdate = !0
    }
    a.lookAt($l.setFromMatrixPosition(this.light.matrixWorld).negate())
  };
  xd.prototype = Object.create(ia.prototype);
  xd.prototype.constructor = xd;
  xd.prototype.dispose = function() {
    this.geometry.dispose();
    this.material.dispose()
  };
  xd.prototype.onBeforeRender = function() {
    this.position.copy(this.lightProbe.position);
    this.scale.set(1, 1, 1).multiplyScalar(this.size);
    this.material.uniforms.intensity.value = this.lightProbe.intensity
  };
  If.prototype = Object.assign(Object.create(Z.prototype), {
    constructor: If,
    copy: function(a) {
      Z.prototype.copy.call(this, a);
      this.geometry.copy(a.geometry);
      this.material.copy(a.material);
      return this
    },
    clone: function() {
      return (new this.constructor).copy(this)
    }
  });
  Jf.prototype = Object.create(Z.prototype);
  Jf.prototype.constructor = Jf;
  yd.prototype = Object.create(pa.prototype);
  yd.prototype.constructor = yd;
  yd.prototype.update = function() {
    function a(a, b, d, f) {
      d = (b - a) / d;
      u.setXYZ(n, 0, 0, 0);
      p++;
      for (q = a; q < b; q += d) t = n + p, u.setXYZ(t,
        Math.sin(q) * c, 0, Math.cos(q) * c), u.setXYZ(t + 1, Math.sin(Math.min(q + d, b)) * c, 0, Math.cos(Math.min(q + d, b)) * c), u.setXYZ(t + 2, 0, 0, 0), p += 3;
      r.addGroup(n, p, f);
      n += p;
      p = 0
    }
    var b = this.audio,
      c = this.range,
      d = this.divisionsInnerAngle,
      f = this.divisionsOuterAngle,
      g = N.degToRad(b.panner.coneInnerAngle);
    b = N.degToRad(b.panner.coneOuterAngle);
    var k = g / 2,
      l = b / 2,
      n = 0,
      p = 0,
      q, t, r = this.geometry,
      u = r.attributes.position;
    r.clearGroups();
    a(-l, -k, f, 0);
    a(-k, k, d, 1);
    a(k, l, f, 0);
    u.needsUpdate = !0;
    g === b && (this.material[0].visible = !1)
  };
  yd.prototype.dispose =
    function() {
      this.geometry.dispose();
      this.material[0].dispose();
      this.material[1].dispose()
    };
  var Ue = new q,
    jg = new q,
    Jj = new ka;
  Ge.prototype = Object.create(Z.prototype);
  Ge.prototype.constructor = Ge;
  Ge.prototype.update = function() {
    this.object.updateMatrixWorld(!0);
    Jj.getNormalMatrix(this.object.matrixWorld);
    var a = this.object.matrixWorld,
      b = this.geometry.attributes.position,
      c = this.object.geometry,
      d = c.vertices;
    c = c.faces;
    for (var f = 0, g = 0, k = c.length; g < k; g++) {
      var l = c[g],
        n = l.normal;
      Ue.copy(d[l.a]).add(d[l.b]).add(d[l.c]).divideScalar(3).applyMatrix4(a);
      jg.copy(n).applyMatrix3(Jj).normalize().multiplyScalar(this.size).add(Ue);
      b.setXYZ(f, Ue.x, Ue.y, Ue.z);
      f += 1;
      b.setXYZ(f, jg.x, jg.y, jg.z);
      f += 1
    }
    b.needsUpdate = !0
  };
  var Kj = new q,
    kg = new q,
    Lj = new q;
  zd.prototype = Object.create(E.prototype);
  zd.prototype.constructor = zd;
  zd.prototype.dispose = function() {
    this.lightPlane.geometry.dispose();
    this.lightPlane.material.dispose();
    this.targetLine.geometry.dispose();
    this.targetLine.material.dispose()
  };
  zd.prototype.update = function() {
    Kj.setFromMatrixPosition(this.light.matrixWorld);
    kg.setFromMatrixPosition(this.light.target.matrixWorld);
    Lj.subVectors(kg, Kj);
    this.lightPlane.lookAt(kg);
    void 0 !== this.color ? (this.lightPlane.material.color.set(this.color), this.targetLine.material.color.set(this.color)) : (this.lightPlane.material.color.copy(this.light.color), this.targetLine.material.color.copy(this.light.color));
    this.targetLine.lookAt(kg);
    this.targetLine.scale.z = Lj.length()
  };
  var Kf = new q,
    U = new hb;
  He.prototype = Object.create(Z.prototype);
  He.prototype.constructor = He;
  He.prototype.update =
    function() {
      var a = this.geometry,
        b = this.pointMap;
      U.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse);
      qa("c", b, a, U, 0, 0, -1);
      qa("t", b, a, U, 0, 0, 1);
      qa("n1", b, a, U, -1, -1, -1);
      qa("n2", b, a, U, 1, -1, -1);
      qa("n3", b, a, U, -1, 1, -1);
      qa("n4", b, a, U, 1, 1, -1);
      qa("f1", b, a, U, -1, -1, 1);
      qa("f2", b, a, U, 1, -1, 1);
      qa("f3", b, a, U, -1, 1, 1);
      qa("f4", b, a, U, 1, 1, 1);
      qa("u1", b, a, U, .7, 1.1, -1);
      qa("u2", b, a, U, -.7, 1.1, -1);
      qa("u3", b, a, U, 0, 2, -1);
      qa("cf1", b, a, U, -1, 0, 1);
      qa("cf2", b, a, U, 1, 0, 1);
      qa("cf3", b, a, U, 0, -1, 1);
      qa("cf4", b, a, U, 0, 1, 1);
      qa("cn1",
        b, a, U, -1, 0, -1);
      qa("cn2", b, a, U, 1, 0, -1);
      qa("cn3", b, a, U, 0, -1, -1);
      qa("cn4", b, a, U, 0, 1, -1);
      a.getAttribute("position").needsUpdate = !0
    };
  var lg = new gb;
  Ab.prototype = Object.create(Z.prototype);
  Ab.prototype.constructor = Ab;
  Ab.prototype.update = function(a) {
    void 0 !== a && console.warn("THREE.BoxHelper: .update() has no longer arguments.");
    void 0 !== this.object && lg.setFromObject(this.object);
    if (!lg.isEmpty()) {
      a = lg.min;
      var b = lg.max,
        c = this.geometry.attributes.position,
        d = c.array;
      d[0] = b.x;
      d[1] = b.y;
      d[2] = b.z;
      d[3] = a.x;
      d[4] =
        b.y;
      d[5] = b.z;
      d[6] = a.x;
      d[7] = a.y;
      d[8] = b.z;
      d[9] = b.x;
      d[10] = a.y;
      d[11] = b.z;
      d[12] = b.x;
      d[13] = b.y;
      d[14] = a.z;
      d[15] = a.x;
      d[16] = b.y;
      d[17] = a.z;
      d[18] = a.x;
      d[19] = a.y;
      d[20] = a.z;
      d[21] = b.x;
      d[22] = a.y;
      d[23] = a.z;
      c.needsUpdate = !0;
      this.geometry.computeBoundingSphere()
    }
  };
  Ab.prototype.setFromObject = function(a) {
    this.object = a;
    this.update();
    return this
  };
  Ab.prototype.copy = function(a) {
    Z.prototype.copy.call(this, a);
    this.object = a.object;
    return this
  };
  Ab.prototype.clone = function() {
    return (new this.constructor).copy(this)
  };
  Ie.prototype =
    Object.create(Z.prototype);
  Ie.prototype.constructor = Ie;
  Ie.prototype.updateMatrixWorld = function(a) {
    var b = this.box;
    b.isEmpty() || (b.getCenter(this.position), b.getSize(this.scale), this.scale.multiplyScalar(.5), E.prototype.updateMatrixWorld.call(this, a))
  };
  Je.prototype = Object.create(pa.prototype);
  Je.prototype.constructor = Je;
  Je.prototype.updateMatrixWorld = function(a) {
    var b = -this.plane.constant;
    1E-8 > Math.abs(b) && (b = 1E-8);
    this.scale.set(.5 * this.size, .5 * this.size, b);
    this.children[0].material.side = 0 > b ? 1 : 0;
    this.lookAt(this.plane.normal);
    E.prototype.updateMatrixWorld.call(this, a)
  };
  var Mj = new q,
    Lf, jh;
  Bb.prototype = Object.create(E.prototype);
  Bb.prototype.constructor = Bb;
  Bb.prototype.setDirection = function(a) {
    .99999 < a.y ? this.quaternion.set(0, 0, 0, 1) : -.99999 > a.y ? this.quaternion.set(1, 0, 0, 0) : (Mj.set(a.z, 0, -a.x).normalize(), this.quaternion.setFromAxisAngle(Mj, Math.acos(a.y)))
  };
  Bb.prototype.setLength = function(a, b, c) {
    void 0 === b && (b = .2 * a);
    void 0 === c && (c = .2 * b);
    this.line.scale.set(1, Math.max(1E-4, a - b), 1);
    this.line.updateMatrix();
    this.cone.scale.set(c,
      b, c);
    this.cone.position.y = a;
    this.cone.updateMatrix()
  };
  Bb.prototype.setColor = function(a) {
    this.line.material.color.set(a);
    this.cone.material.color.set(a)
  };
  Bb.prototype.copy = function(a) {
    E.prototype.copy.call(this, a, !1);
    this.line.copy(a.line);
    this.cone.copy(a.cone);
    return this
  };
  Bb.prototype.clone = function() {
    return (new this.constructor).copy(this)
  };
  Ke.prototype = Object.create(Z.prototype);
  Ke.prototype.constructor = Ke;
  M.create = function(a, b) {
    console.log("THREE.Curve.create() has been deprecated");
    a.prototype =
      Object.create(M.prototype);
    a.prototype.constructor = a;
    a.prototype.getPoint = b;
    return a
  };
  Object.assign(zb.prototype, {
    createPointsGeometry: function(a) {
      console.warn("THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");
      a = this.getPoints(a);
      return this.createGeometry(a)
    },
    createSpacedPointsGeometry: function(a) {
      console.warn("THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");
      a = this.getSpacedPoints(a);
      return this.createGeometry(a)
    },
    createGeometry: function(a) {
      console.warn("THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");
      for (var b = new P, c = 0, d = a.length; c < d; c++) {
        var f = a[c];
        b.vertices.push(new q(f.x, f.y, f.z || 0))
      }
      return b
    }
  });
  Object.assign(ab.prototype, {
    fromPoints: function(a) {
      console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints().");
      return this.setFromPoints(a)
    }
  });
  Wi.prototype = Object.create(la.prototype);
  Xi.prototype = Object.create(la.prototype);
  kh.prototype = Object.create(la.prototype);
  Object.assign(kh.prototype, {
    initFromArray: function() {
      console.error("THREE.Spline: .initFromArray() has been removed.")
    },
    getControlPointsArray: function() {
      console.error("THREE.Spline: .getControlPointsArray() has been removed.")
    },
    reparametrizeByArcLength: function() {
      console.error("THREE.Spline: .reparametrizeByArcLength() has been removed.")
    }
  });
  If.prototype.setColors = function() {
    console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")
  };
  td.prototype.update = function() {
    console.error("THREE.SkeletonHelper: update() no longer needs to be called.")
  };
  Object.assign(X.prototype, {
    extractUrlBase: function(a) {
      console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.");
      return Kh.extractUrlBase(a)
    }
  });
  X.Handlers = {
    add: function() {
      console.error("THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.")
    },
    get: function() {
      console.error("THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.")
    }
  };
  Object.assign(Ef.prototype, {
    setTexturePath: function(a) {
      console.warn("THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().");
      return this.setResourcePath(a)
    }
  });
  Object.assign(hh.prototype, {
    center: function(a) {
      console.warn("THREE.Box2: .center() has been renamed to .getCenter().");
      return this.getCenter(a)
    },
    empty: function() {
      console.warn("THREE.Box2: .empty() has been renamed to .isEmpty().");
      return this.isEmpty()
    },
    isIntersectionBox: function(a) {
      console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().");
      return this.intersectsBox(a)
    },
    size: function(a) {
      console.warn("THREE.Box2: .size() has been renamed to .getSize().");
      return this.getSize(a)
    }
  });
  Object.assign(gb.prototype, {
    center: function(a) {
      console.warn("THREE.Box3: .center() has been renamed to .getCenter().");
      return this.getCenter(a)
    },
    empty: function() {
      console.warn("THREE.Box3: .empty() has been renamed to .isEmpty().");
      return this.isEmpty()
    },
    isIntersectionBox: function(a) {
      console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().");
      return this.intersectsBox(a)
    },
    isIntersectionSphere: function(a) {
      console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().");
      return this.intersectsSphere(a)
    },
    size: function(a) {
      console.warn("THREE.Box3: .size() has been renamed to .getSize().");
      return this.getSize(a)
    }
  });
  ih.prototype.center = function(a) {
    console.warn("THREE.Line3: .center() has been renamed to .getCenter().");
    return this.getCenter(a)
  };
  Object.assign(N, {
    random16: function() {
      console.warn("THREE.Math: .random16() has been deprecated. Use Math.random() instead.");
      return Math.random()
    },
    nearestPowerOfTwo: function(a) {
      console.warn("THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().");
      return N.floorPowerOfTwo(a)
    },
    nextPowerOfTwo: function(a) {
      console.warn("THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().");
      return N.ceilPowerOfTwo(a)
    }
  });
  Object.assign(ka.prototype, {
    flattenToArrayOffset: function(a, b) {
      console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");
      return this.toArray(a, b)
    },
    multiplyVector3: function(a) {
      console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.");
      return a.applyMatrix3(this)
    },
    multiplyVector3Array: function() {
      console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")
    },
    applyToBuffer: function(a) {
      console.warn("THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");
      return this.applyToBufferAttribute(a)
    },
    applyToVector3Array: function() {
      console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")
    }
  });
  Object.assign(I.prototype, {
    extractPosition: function(a) {
      console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().");
      return this.copyPosition(a)
    },
    flattenToArrayOffset: function(a, b) {
      console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");
      return this.toArray(a, b)
    },
    getPosition: function() {
      console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.");
      return (new q).setFromMatrixColumn(this,
        3)
    },
    setRotationFromQuaternion: function(a) {
      console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().");
      return this.makeRotationFromQuaternion(a)
    },
    multiplyToArray: function() {
      console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")
    },
    multiplyVector3: function(a) {
      console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.");
      return a.applyMatrix4(this)
    },
    multiplyVector4: function(a) {
      console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");
      return a.applyMatrix4(this)
    },
    multiplyVector3Array: function() {
      console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")
    },
    rotateAxis: function(a) {
      console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.");
      a.transformDirection(this)
    },
    crossVector: function(a) {
      console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.");
      return a.applyMatrix4(this)
    },
    translate: function() {
      console.error("THREE.Matrix4: .translate() has been removed.")
    },
    rotateX: function() {
      console.error("THREE.Matrix4: .rotateX() has been removed.")
    },
    rotateY: function() {
      console.error("THREE.Matrix4: .rotateY() has been removed.")
    },
    rotateZ: function() {
      console.error("THREE.Matrix4: .rotateZ() has been removed.")
    },
    rotateByAxis: function() {
      console.error("THREE.Matrix4: .rotateByAxis() has been removed.")
    },
    applyToBuffer: function(a) {
      console.warn("THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");
      return this.applyToBufferAttribute(a)
    },
    applyToVector3Array: function() {
      console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")
    },
    makeFrustum: function(a, b, c, d, f, g) {
      console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.");
      return this.makePerspective(a, b, d, c, f, g)
    }
  });
  Sa.prototype.isIntersectionLine = function(a) {
    console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().");
    return this.intersectsLine(a)
  };
  ya.prototype.multiplyVector3 =
    function(a) {
      console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.");
      return a.applyQuaternion(this)
    };
  Object.assign(ac.prototype, {
    isIntersectionBox: function(a) {
      console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().");
      return this.intersectsBox(a)
    },
    isIntersectionPlane: function(a) {
      console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().");
      return this.intersectsPlane(a)
    },
    isIntersectionSphere: function(a) {
      console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().");
      return this.intersectsSphere(a)
    }
  });
  Object.assign(va.prototype, {
    area: function() {
      console.warn("THREE.Triangle: .area() has been renamed to .getArea().");
      return this.getArea()
    },
    barycoordFromPoint: function(a, b) {
      console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().");
      return this.getBarycoord(a, b)
    },
    midpoint: function(a) {
      console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint().");
      return this.getMidpoint(a)
    },
    normal: function(a) {
      console.warn("THREE.Triangle: .normal() has been renamed to .getNormal().");
      return this.getNormal(a)
    },
    plane: function(a) {
      console.warn("THREE.Triangle: .plane() has been renamed to .getPlane().");
      return this.getPlane(a)
    }
  });
  Object.assign(va, {
    barycoordFromPoint: function(a, b, c, d, f) {
      console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().");
      return va.getBarycoord(a, b, c, d, f)
    },
    normal: function(a, b, c, d) {
      console.warn("THREE.Triangle: .normal() has been renamed to .getNormal().");
      return va.getNormal(a, b, c, d)
    }
  });
  Object.assign(Pb.prototype, {
    extractAllPoints: function(a) {
      console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.");
      return this.extractPoints(a)
    },
    extrude: function(a) {
      console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.");
      return new oc(this, a)
    },
    makeGeometry: function(a) {
      console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.");
      return new pc(this, a)
    }
  });
  Object.assign(z.prototype, {
    fromAttribute: function(a, b, c) {
      console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().");
      return this.fromBufferAttribute(a, b, c)
    },
    distanceToManhattan: function(a) {
      console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().");
      return this.manhattanDistanceTo(a)
    },
    lengthManhattan: function() {
      console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().");
      return this.manhattanLength()
    }
  });
  Object.assign(q.prototype, {
    setEulerFromRotationMatrix: function() {
      console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")
    },
    setEulerFromQuaternion: function() {
      console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")
    },
    getPositionFromMatrix: function(a) {
      console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().");
      return this.setFromMatrixPosition(a)
    },
    getScaleFromMatrix: function(a) {
      console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().");
      return this.setFromMatrixScale(a)
    },
    getColumnFromMatrix: function(a, b) {
      console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().");
      return this.setFromMatrixColumn(b,
        a)
    },
    applyProjection: function(a) {
      console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.");
      return this.applyMatrix4(a)
    },
    fromAttribute: function(a, b, c) {
      console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().");
      return this.fromBufferAttribute(a, b, c)
    },
    distanceToManhattan: function(a) {
      console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().");
      return this.manhattanDistanceTo(a)
    },
    lengthManhattan: function() {
      console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().");
      return this.manhattanLength()
    }
  });
  Object.assign(ca.prototype, {
    fromAttribute: function(a, b, c) {
      console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().");
      return this.fromBufferAttribute(a, b, c)
    },
    lengthManhattan: function() {
      console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().");
      return this.manhattanLength()
    }
  });
  Object.assign(P.prototype, {
    computeTangents: function() {
      console.error("THREE.Geometry: .computeTangents() has been removed.")
    },
    computeLineDistances: function() {
      console.error("THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.")
    }
  });
  Object.assign(E.prototype, {
    getChildByName: function(a) {
      console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().");
      return this.getObjectByName(a)
    },
    renderDepth: function() {
      console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")
    },
    translate: function(a, b) {
      console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.");
      return this.translateOnAxis(b, a)
    },
    getWorldRotation: function() {
      console.error("THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.")
    }
  });
  Object.defineProperties(E.prototype, {
    eulerOrder: {
      get: function() {
        console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");
        return this.rotation.order
      },
      set: function(a) {
        console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");
        this.rotation.order = a
      }
    },
    useQuaternion: {
      get: function() {
        console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")
      },
      set: function() {
        console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")
      }
    }
  });
  Object.defineProperties(be.prototype, {
    objects: {
      get: function() {
        console.warn("THREE.LOD: .objects has been renamed to .levels.");
        return this.levels
      }
    }
  });
  Object.defineProperty(ff.prototype, "useVertexTexture", {
    get: function() {
      console.warn("THREE.Skeleton: useVertexTexture has been removed.")
    },
    set: function() {
      console.warn("THREE.Skeleton: useVertexTexture has been removed.")
    }
  });
  ce.prototype.initBones = function() {
    console.error("THREE.SkinnedMesh: initBones() has been removed.")
  };
  Object.defineProperty(M.prototype,
    "__arcLengthDivisions", {
      get: function() {
        console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");
        return this.arcLengthDivisions
      },
      set: function(a) {
        console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");
        this.arcLengthDivisions = a
      }
    });
  na.prototype.setLens = function(a, b) {
    console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup.");
    void 0 !== b && (this.filmGauge = b);
    this.setFocalLength(a)
  };
  Object.defineProperties(da.prototype, {
    onlyShadow: {
      set: function() {
        console.warn("THREE.Light: .onlyShadow has been removed.")
      }
    },
    shadowCameraFov: {
      set: function(a) {
        console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov.");
        this.shadow.camera.fov = a
      }
    },
    shadowCameraLeft: {
      set: function(a) {
        console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left.");
        this.shadow.camera.left = a
      }
    },
    shadowCameraRight: {
      set: function(a) {
        console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right.");
        this.shadow.camera.right = a
      }
    },
    shadowCameraTop: {
      set: function(a) {
        console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top.");
        this.shadow.camera.top = a
      }
    },
    shadowCameraBottom: {
      set: function(a) {
        console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.");
        this.shadow.camera.bottom = a
      }
    },
    shadowCameraNear: {
      set: function(a) {
        console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near.");
        this.shadow.camera.near = a
      }
    },
    shadowCameraFar: {
      set: function(a) {
        console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far.");
        this.shadow.camera.far = a
      }
    },
    shadowCameraVisible: {
      set: function() {
        console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")
      }
    },
    shadowBias: {
      set: function(a) {
        console.warn("THREE.Light: .shadowBias is now .shadow.bias.");
        this.shadow.bias = a
      }
    },
    shadowDarkness: {
      set: function() {
        console.warn("THREE.Light: .shadowDarkness has been removed.")
      }
    },
    shadowMapWidth: {
      set: function(a) {
        console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.");
        this.shadow.mapSize.width = a
      }
    },
    shadowMapHeight: {
      set: function(a) {
        console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.");
        this.shadow.mapSize.height = a
      }
    }
  });
  Object.defineProperties(O.prototype, {
    length: {
      get: function() {
        console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead.");
        return this.array.length
      }
    },
    dynamic: {
      get: function() {
        console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.");
        return 35048 === this.usage
      },
      set: function() {
        console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.");
        this.setUsage(35048)
      }
    }
  });
  Object.assign(O.prototype, {
    setDynamic: function(a) {
      console.warn("THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead.");
      this.setUsage(!0 === a ? 35048 : 35044);
      return this
    },
    copyIndicesArray: function() {
      console.error("THREE.BufferAttribute: .copyIndicesArray() has been removed.")
    },
    setArray: function() {
      console.error("THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")
    }
  });
  Object.assign(G.prototype, {
    addIndex: function(a) {
      console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().");
      this.setIndex(a)
    },
    addAttribute: function(a, b, c) {
      console.warn("THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute().");
      return b && b.isBufferAttribute || b && b.isInterleavedBufferAttribute ? "index" === a ? (console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."), this.setIndex(b), this) : this.setAttribute(a, b) : (console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."), this.setAttribute(a, new O(b, c)))
    },
    addDrawCall: function(a, b, c) {
      void 0 !== c && console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.");
      console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup().");
      this.addGroup(a, b)
    },
    clearDrawCalls: function() {
      console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().");
      this.clearGroups()
    },
    computeTangents: function() {
      console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")
    },
    computeOffsets: function() {
      console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")
    },
    removeAttribute: function(a) {
      console.warn("THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute().");
      return this.deleteAttribute(a)
    }
  });
  Object.defineProperties(G.prototype, {
    drawcalls: {
      get: function() {
        console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups.");
        return this.groups
      }
    },
    offsets: {
      get: function() {
        console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups.");
        return this.groups
      }
    }
  });
  Object.defineProperties(wb.prototype, {
    dynamic: {
      get: function() {
        console.warn("THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead.");
        return 35048 === this.usage
      },
      set: function(a) {
        console.warn("THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead.");
        this.setUsage(a)
      }
    }
  });
  Object.assign(wb.prototype, {
    setDynamic: function(a) {
      console.warn("THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead.");
      this.setUsage(!0 === a ? 35048 : 35044);
      return this
    },
    setArray: function() {
      console.error("THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")
    }
  });
  Object.assign(jb.prototype, {
    getArrays: function() {
      console.error("THREE.ExtrudeBufferGeometry: .getArrays() has been removed.")
    },
    addShapeList: function() {
      console.error("THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.")
    },
    addShape: function() {
      console.error("THREE.ExtrudeBufferGeometry: .addShape() has been removed.")
    }
  });
  Object.defineProperties(Hf.prototype, {
    dynamic: {
      set: function() {
        console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")
      }
    },
    onUpdate: {
      value: function() {
        console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.");
        return this
      }
    }
  });
  Object.defineProperties(R.prototype, {
    wrapAround: {
      get: function() {
        console.warn("THREE.Material: .wrapAround has been removed.")
      },
      set: function() {
        console.warn("THREE.Material: .wrapAround has been removed.")
      }
    },
    overdraw: {
      get: function() {
        console.warn("THREE.Material: .overdraw has been removed.")
      },
      set: function() {
        console.warn("THREE.Material: .overdraw has been removed.")
      }
    },
    wrapRGB: {
      get: function() {
        console.warn("THREE.Material: .wrapRGB has been removed.");
        return new D
      }
    },
    shading: {
      get: function() {
        console.error("THREE." +
          this.type + ": .shading has been removed. Use the boolean .flatShading instead.")
      },
      set: function(a) {
        console.warn("THREE." + this.type + ": .shading has been removed. Use the boolean .flatShading instead.");
        this.flatShading = 1 === a
      }
    },
    stencilMask: {
      get: function() {
        console.warn("THREE." + this.type + ": .stencilMask has been removed. Use .stencilFuncMask instead.");
        return this.stencilFuncMask
      },
      set: function(a) {
        console.warn("THREE." + this.type + ": .stencilMask has been removed. Use .stencilFuncMask instead.");
        this.stencilFuncMask =
          a
      }
    }
  });
  Object.defineProperties(Wa.prototype, {
    metal: {
      get: function() {
        console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.");
        return !1
      },
      set: function() {
        console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")
      }
    }
  });
  Object.defineProperties(Aa.prototype, {
    derivatives: {
      get: function() {
        console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");
        return this.extensions.derivatives
      },
      set: function(a) {
        console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");
        this.extensions.derivatives = a
      }
    }
  });
  Object.assign(Hg.prototype, {
    clearTarget: function(a, b, c, d) {
      console.warn("THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead.");
      this.setRenderTarget(a);
      this.clear(b, c, d)
    },
    animate: function(a) {
      console.warn("THREE.WebGLRenderer: .animate() is now .setAnimationLoop().");
      this.setAnimationLoop(a)
    },
    getCurrentRenderTarget: function() {
      console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().");
      return this.getRenderTarget()
    },
    getMaxAnisotropy: function() {
      console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().");
      return this.capabilities.getMaxAnisotropy()
    },
    getPrecision: function() {
      console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.");
      return this.capabilities.precision
    },
    resetGLState: function() {
      console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset().");
      return this.state.reset()
    },
    supportsFloatTextures: function() {
      console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' ).");
      return this.extensions.get("OES_texture_float")
    },
    supportsHalfFloatTextures: function() {
      console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' ).");
      return this.extensions.get("OES_texture_half_float")
    },
    supportsStandardDerivatives: function() {
      console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' ).");
      return this.extensions.get("OES_standard_derivatives")
    },
    supportsCompressedTextureS3TC: function() {
      console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' ).");
      return this.extensions.get("WEBGL_compressed_texture_s3tc")
    },
    supportsCompressedTexturePVRTC: function() {
      console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' ).");
      return this.extensions.get("WEBGL_compressed_texture_pvrtc")
    },
    supportsBlendMinMax: function() {
      console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' ).");
      return this.extensions.get("EXT_blend_minmax")
    },
    supportsVertexTextures: function() {
      console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.");
      return this.capabilities.vertexTextures
    },
    supportsInstancedArrays: function() {
      console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' ).");
      return this.extensions.get("ANGLE_instanced_arrays")
    },
    enableScissorTest: function(a) {
      console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().");
      this.setScissorTest(a)
    },
    initMaterial: function() {
      console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")
    },
    addPrePlugin: function() {
      console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")
    },
    addPostPlugin: function() {
      console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")
    },
    updateShadowMap: function() {
      console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")
    },
    setFaceCulling: function() {
      console.warn("THREE.WebGLRenderer: .setFaceCulling() has been removed.")
    },
    allocTextureUnit: function() {
      console.warn("THREE.WebGLRenderer: .allocTextureUnit() has been removed.")
    },
    setTexture: function() {
      console.warn("THREE.WebGLRenderer: .setTexture() has been removed.")
    },
    setTexture2D: function() {
      console.warn("THREE.WebGLRenderer: .setTexture2D() has been removed.")
    },
    setTextureCube: function() {
      console.warn("THREE.WebGLRenderer: .setTextureCube() has been removed.")
    },
    getActiveMipMapLevel: function() {
      console.warn("THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel().");
      return this.getActiveMipmapLevel()
    }
  });
  Object.defineProperties(Hg.prototype, {
    shadowMapEnabled: {
      get: function() {
        return this.shadowMap.enabled
      },
      set: function(a) {
        console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.");
        this.shadowMap.enabled = a
      }
    },
    shadowMapType: {
      get: function() {
        return this.shadowMap.type
      },
      set: function(a) {
        console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.");
        this.shadowMap.type = a
      }
    },
    shadowMapCullFace: {
      get: function() {
        console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")
      },
      set: function() {
        console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")
      }
    },
    context: {
      get: function() {
        console.warn("THREE.WebGLRenderer: .context has been removed. Use .getContext() instead.");
        return this.getContext()
      }
    }
  });
  Object.defineProperties(ui.prototype, {
    cullFace: {
      get: function() {
        console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")
      },
      set: function() {
        console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")
      }
    },
    renderReverseSided: {
      get: function() {
        console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")
      },
      set: function() {
        console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")
      }
    },
    renderSingleSided: {
      get: function() {
        console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")
      },
      set: function() {
        console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")
      }
    }
  });
  Object.defineProperties(Ib.prototype, {
    activeCubeFace: {
      set: function() {
        console.warn("THREE.WebGLRenderTargetCube: .activeCubeFace has been removed. It is now the second parameter of WebGLRenderer.setRenderTarget().")
      }
    },
    activeMipMapLevel: {
      set: function() {
        console.warn("THREE.WebGLRenderTargetCube: .activeMipMapLevel has been removed. It is now the third parameter of WebGLRenderer.setRenderTarget().")
      }
    }
  });
  Object.defineProperties(sa.prototype, {
    wrapS: {
      get: function() {
        console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");
        return this.texture.wrapS
      },
      set: function(a) {
        console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");
        this.texture.wrapS = a
      }
    },
    wrapT: {
      get: function() {
        console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");
        return this.texture.wrapT
      },
      set: function(a) {
        console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");
        this.texture.wrapT = a
      }
    },
    magFilter: {
      get: function() {
        console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");
        return this.texture.magFilter
      },
      set: function(a) {
        console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");
        this.texture.magFilter = a
      }
    },
    minFilter: {
      get: function() {
        console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");
        return this.texture.minFilter
      },
      set: function(a) {
        console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");
        this.texture.minFilter = a
      }
    },
    anisotropy: {
      get: function() {
        console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");
        return this.texture.anisotropy
      },
      set: function(a) {
        console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");
        this.texture.anisotropy = a
      }
    },
    offset: {
      get: function() {
        console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");
        return this.texture.offset
      },
      set: function(a) {
        console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");
        this.texture.offset = a
      }
    },
    repeat: {
      get: function() {
        console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");
        return this.texture.repeat
      },
      set: function(a) {
        console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");
        this.texture.repeat = a
      }
    },
    format: {
      get: function() {
        console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");
        return this.texture.format
      },
      set: function(a) {
        console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");
        this.texture.format = a
      }
    },
    type: {
      get: function() {
        console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");
        return this.texture.type
      },
      set: function(a) {
        console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");
        this.texture.type = a
      }
    },
    generateMipmaps: {
      get: function() {
        console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");
        return this.texture.generateMipmaps
      },
      set: function(a) {
        console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");
        this.texture.generateMipmaps = a
      }
    }
  });
  Object.defineProperties(Gg.prototype, {
    standing: {
      set: function() {
        console.warn("THREE.WebVRManager: .standing has been removed.")
      }
    },
    userHeight: {
      set: function() {
        console.warn("THREE.WebVRManager: .userHeight has been removed.")
      }
    }
  });
  Object.defineProperties(rd.prototype, {
    load: {
      value: function(a) {
        console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");
        var b = this;
        (new Ff).load(a, function(a) {
          b.setBuffer(a)
        });
        return this
      }
    },
    startTime: {
      set: function() {
        console.warn("THREE.Audio: .startTime is now .play( delay ).")
      }
    }
  });
  ch.prototype.getData = function() {
    console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData().");
    return this.getFrequencyData()
  };
  Qc.prototype.updateCubeMap = function(a, b) {
    console.warn("THREE.CubeCamera: .updateCubeMap() is now .update().");
    return this.update(a, b)
  };
  Qb.crossOrigin = void 0;
  Qb.loadTexture = function(a, b, c, d) {
    console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");
    var f = new rf;
    f.setCrossOrigin(this.crossOrigin);
    a = f.load(a, c, void 0, d);
    b && (a.mapping = b);
    return a
  };
  Qb.loadTextureCube = function(a, b, c, d) {
    console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");
    var f = new qf;
    f.setCrossOrigin(this.crossOrigin);
    a = f.load(a, c, void 0, d);
    b && (a.mapping = b);
    return a
  };
  Qb.loadCompressedTexture = function() {
    console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")
  };
  Qb.loadCompressedTextureCube = function() {
    console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")
  };
  var am = kc;
  "undefined" !== typeof __THREE_DEVTOOLS__ && __THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register", {
    detail: {
      revision: "110"
    }
  }));
  l.ACESFilmicToneMapping = 5;
  l.AddEquation = 100;
  l.AddOperation = 2;
  l.AdditiveBlending = 2;
  l.AlphaFormat = 1021;
  l.AlwaysDepth = 1;
  l.AlwaysStencilFunc = 519;
  l.AmbientLight = yf;
  l.AmbientLightProbe = Yg;
  l.AnimationClip = Pa;
  l.AnimationLoader = Pg;
  l.AnimationMixer = eh;
  l.AnimationObjectGroup = Pi;
  l.AnimationUtils = aa;
  l.ArcCurve = qd;
  l.ArrayCamera = Yd;
  l.ArrowHelper = Bb;
  l.Audio = rd;
  l.AudioAnalyser =
    ch;
  l.AudioContext = ah;
  l.AudioListener = $g;
  l.AudioLoader = Ff;
  l.AxesHelper = Ke;
  l.AxisHelper = function(a) {
    console.warn("THREE.AxisHelper has been renamed to THREE.AxesHelper.");
    return new Ke(a)
  };
  l.BackSide = 1;
  l.BasicDepthPacking = 3200;
  l.BasicShadowMap = 0;
  l.BinaryTextureLoader = function(a) {
    console.warn("THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.");
    return new pf(a)
  };
  l.Bone = Ig;
  l.BooleanKeyframeTrack = lf;
  l.BoundingBoxHelper = function(a, b) {
    console.warn("THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.");
    return new Ab(a, b)
  };
  l.Box2 = hh;
  l.Box3 = gb;
  l.Box3Helper = Ie;
  l.BoxBufferGeometry = Ud;
  l.BoxGeometry = Eh;
  l.BoxHelper = Ab;
  l.BufferAttribute = O;
  l.BufferGeometry = G;
  l.BufferGeometryLoader = Df;
  l.ByteType = 1010;
  l.Cache = Fc;
  l.Camera = hb;
  l.CameraHelper = He;
  l.CanvasRenderer = function() {
    console.error("THREE.CanvasRenderer has been removed")
  };
  l.CanvasTexture = de;
  l.CatmullRomCurve3 = la;
  l.CineonToneMapping = 4;
  l.CircleBufferGeometry = ld;
  l.CircleGeometry = ye;
  l.ClampToEdgeWrapping = 1001;
  l.Clock = Zg;
  l.ClosedSplineCurve3 = Wi;
  l.Color = D;
  l.ColorKeyframeTrack =
    mf;
  l.CompressedTexture = Zc;
  l.CompressedTextureLoader = Qg;
  l.ConeBufferGeometry = xe;
  l.ConeGeometry = we;
  l.CubeCamera = Qc;
  l.CubeGeometry = Eh;
  l.CubeReflectionMapping = 301;
  l.CubeRefractionMapping = 302;
  l.CubeTexture = vb;
  l.CubeTextureLoader = qf;
  l.CubeUVReflectionMapping = 306;
  l.CubeUVRefractionMapping = 307;
  l.CubicBezierCurve = Xa;
  l.CubicBezierCurve3 = lb;
  l.CubicInterpolant = jf;
  l.CullFaceBack = 1;
  l.CullFaceFront = 2;
  l.CullFaceFrontBack = 3;
  l.CullFaceNone = 0;
  l.Curve = M;
  l.CurvePath = zb;
  l.CustomBlending = 5;
  l.CylinderBufferGeometry = yb;
  l.CylinderGeometry =
    rc;
  l.Cylindrical = Ui;
  l.DataTexture = hc;
  l.DataTexture2DArray = Rc;
  l.DataTexture3D = Sc;
  l.DataTextureLoader = pf;
  l.DecrementStencilOp = 7683;
  l.DecrementWrapStencilOp = 34056;
  l.DefaultLoadingManager = Li;
  l.DepthFormat = 1026;
  l.DepthStencilFormat = 1027;
  l.DepthTexture = ee;
  l.DirectionalLight = xf;
  l.DirectionalLightHelper = zd;
  l.DirectionalLightShadow = wf;
  l.DiscreteInterpolant = kf;
  l.DodecahedronBufferGeometry = dd;
  l.DodecahedronGeometry = ke;
  l.DoubleSide = 2;
  l.DstAlphaFactor = 206;
  l.DstColorFactor = 208;
  l.DynamicBufferAttribute = function(a,
    b) {
    console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.");
    return (new O(a, b)).setDynamic(!0)
  };
  l.DynamicCopyUsage = 35050;
  l.DynamicDrawUsage = 35048;
  l.DynamicReadUsage = 35049;
  l.EdgesGeometry = kd;
  l.EdgesHelper = function(a, b) {
    console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.");
    return new Z(new kd(a.geometry), new T({
      color: void 0 !== b ? b : 16777215
    }))
  };
  l.EllipseCurve = Ma;
  l.EqualDepth = 4;
  l.EqualStencilFunc = 514;
  l.EquirectangularReflectionMapping =
    303;
  l.EquirectangularRefractionMapping = 304;
  l.Euler = Zb;
  l.EventDispatcher = Ra;
  l.ExtrudeBufferGeometry = jb;
  l.ExtrudeGeometry = oc;
  l.Face3 = Mc;
  l.Face4 = function(a, b, c, d, f, g, k) {
    console.warn("THREE.Face4 has been removed. A THREE.Face3 will be created instead.");
    return new Mc(a, b, c, f, g, k)
  };
  l.FaceColors = 1;
  l.FaceNormalsHelper = Ge;
  l.FileLoader = Qa;
  l.FlatShading = 1;
  l.Float32Attribute = function(a, b) {
    console.warn("THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.");
    return new F(a,
      b)
  };
  l.Float32BufferAttribute = F;
  l.Float64Attribute = function(a, b) {
    console.warn("THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.");
    return new Qd(a, b)
  };
  l.Float64BufferAttribute = Qd;
  l.FloatType = 1015;
  l.Fog = df;
  l.FogExp2 = cf;
  l.Font = Vg;
  l.FontLoader = Wg;
  l.FrontFaceDirectionCCW = 1;
  l.FrontFaceDirectionCW = 0;
  l.FrontSide = 0;
  l.Frustum = Sd;
  l.GammaEncoding = 3007;
  l.Geometry = P;
  l.GeometryUtils = {
    merge: function(a, b, c) {
      console.warn("THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.");
      if (b.isMesh) {
        b.matrixAutoUpdate && b.updateMatrix();
        var d = b.matrix;
        b = b.geometry
      }
      a.merge(b, d, c)
    },
    center: function(a) {
      console.warn("THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.");
      return a.center()
    }
  };
  l.GreaterDepth = 6;
  l.GreaterEqualDepth = 5;
  l.GreaterEqualStencilFunc = 518;
  l.GreaterStencilFunc = 516;
  l.GridHelper = If;
  l.Group = Vc;
  l.HalfFloatType = 1016;
  l.HemisphereLight = sf;
  l.HemisphereLightHelper = wd;
  l.HemisphereLightProbe = Xg;
  l.IcosahedronBufferGeometry = cd;
  l.IcosahedronGeometry =
    je;
  l.ImageBitmapLoader = Tg;
  l.ImageLoader = pd;
  l.ImageUtils = Qb;
  l.ImmediateRenderObject = Ee;
  l.IncrementStencilOp = 7682;
  l.IncrementWrapStencilOp = 34055;
  l.InstancedBufferAttribute = Cf;
  l.InstancedBufferGeometry = Bf;
  l.InstancedInterleavedBuffer = fh;
  l.InstancedMesh = gf;
  l.Int16Attribute = function(a, b) {
    console.warn("THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.");
    return new Od(a, b)
  };
  l.Int16BufferAttribute = Od;
  l.Int32Attribute = function(a, b) {
    console.warn("THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.");
    return new Pd(a, b)
  };
  l.Int32BufferAttribute = Pd;
  l.Int8Attribute = function(a, b) {
    console.warn("THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.");
    return new Ld(a, b)
  };
  l.Int8BufferAttribute = Ld;
  l.IntType = 1013;
  l.InterleavedBuffer = wb;
  l.InterleavedBufferAttribute = Zd;
  l.Interpolant = La;
  l.InterpolateDiscrete = 2300;
  l.InterpolateLinear = 2301;
  l.InterpolateSmooth = 2302;
  l.InvertStencilOp = 5386;
  l.JSONLoader = function() {
    console.error("THREE.JSONLoader has been removed.")
  };
  l.KeepStencilOp = 7680;
  l.KeyframeTrack = ua;
  l.LOD = be;
  l.LatheBufferGeometry = jd;
  l.LatheGeometry = ve;
  l.Layers = rg;
  l.LensFlare = function() {
    console.error("THREE.LensFlare has been moved to /examples/js/objects/Lensflare.js")
  };
  l.LessDepth = 2;
  l.LessEqualDepth = 3;
  l.LessEqualStencilFunc = 515;
  l.LessStencilFunc = 513;
  l.Light = da;
  l.LightProbe = bb;
  l.LightProbeHelper = xd;
  l.LightShadow = nb;
  l.Line = pa;
  l.Line3 = ih;
  l.LineBasicMaterial = T;
  l.LineCurve = Ga;
  l.LineCurve3 = Ya;
  l.LineDashedMaterial = yc;
  l.LineLoop = hf;
  l.LinePieces = 1;
  l.LineSegments = Z;
  l.LineStrip = 0;
  l.LinearEncoding =
    3E3;
  l.LinearFilter = 1006;
  l.LinearInterpolant = ze;
  l.LinearMipMapLinearFilter = 1008;
  l.LinearMipMapNearestFilter = 1007;
  l.LinearMipmapLinearFilter = 1008;
  l.LinearMipmapNearestFilter = 1007;
  l.LinearToneMapping = 1;
  l.Loader = X;
  l.LoaderUtils = Kh;
  l.LoadingManager = Og;
  l.LogLuvEncoding = 3003;
  l.LoopOnce = 2200;
  l.LoopPingPong = 2202;
  l.LoopRepeat = 2201;
  l.LuminanceAlphaFormat = 1025;
  l.LuminanceFormat = 1024;
  l.MOUSE = {
    LEFT: 0,
    MIDDLE: 1,
    RIGHT: 2,
    ROTATE: 0,
    DOLLY: 1,
    PAN: 2
  };
  l.Material = R;
  l.MaterialLoader = Af;
  l.Math = N;
  l.Matrix3 = ka;
  l.Matrix4 = I;
  l.MaxEquation =
    104;
  l.Mesh = ia;
  l.MeshBasicMaterial = Ia;
  l.MeshDepthMaterial = Kb;
  l.MeshDistanceMaterial = Lb;
  l.MeshFaceMaterial = function(a) {
    console.warn("THREE.MeshFaceMaterial has been removed. Use an Array instead.");
    return a
  };
  l.MeshLambertMaterial = wc;
  l.MeshMatcapMaterial = xc;
  l.MeshNormalMaterial = vc;
  l.MeshPhongMaterial = Wa;
  l.MeshPhysicalMaterial = tc;
  l.MeshStandardMaterial = kb;
  l.MeshToonMaterial = uc;
  l.MinEquation = 103;
  l.MirroredRepeatWrapping = 1002;
  l.MixOperation = 1;
  l.MultiMaterial = function(a) {
    void 0 === a && (a = []);
    console.warn("THREE.MultiMaterial has been removed. Use an Array instead.");
    a.isMultiMaterial = !0;
    a.materials = a;
    a.clone = function() {
      return a.slice()
    };
    return a
  };
  l.MultiplyBlending = 4;
  l.MultiplyOperation = 0;
  l.NearestFilter = 1003;
  l.NearestMipMapLinearFilter = 1005;
  l.NearestMipMapNearestFilter = 1004;
  l.NearestMipmapLinearFilter = 1005;
  l.NearestMipmapNearestFilter = 1004;
  l.NeverDepth = 0;
  l.NeverStencilFunc = 512;
  l.NoBlending = 0;
  l.NoColors = 0;
  l.NoToneMapping = 0;
  l.NormalBlending = 1;
  l.NotEqualDepth = 7;
  l.NotEqualStencilFunc = 517;
  l.NumberKeyframeTrack = nd;
  l.Object3D = E;
  l.ObjectLoader = Ef;
  l.ObjectSpaceNormalMap =
    1;
  l.OctahedronBufferGeometry = lc;
  l.OctahedronGeometry = ie;
  l.OneFactor = 201;
  l.OneMinusDstAlphaFactor = 207;
  l.OneMinusDstColorFactor = 209;
  l.OneMinusSrcAlphaFactor = 205;
  l.OneMinusSrcColorFactor = 203;
  l.OrthographicCamera = De;
  l.PCFShadowMap = 1;
  l.PCFSoftShadowMap = 2;
  l.ParametricBufferGeometry = ad;
  l.ParametricGeometry = fe;
  l.Particle = function(a) {
    console.warn("THREE.Particle has been renamed to THREE.Sprite.");
    return new $d(a)
  };
  l.ParticleBasicMaterial = function(a) {
    console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.");
    return new Va(a)
  };
  l.ParticleSystem = function(a, b) {
    console.warn("THREE.ParticleSystem has been renamed to THREE.Points.");
    return new Yc(a, b)
  };
  l.ParticleSystemMaterial = function(a) {
    console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.");
    return new Va(a)
  };
  l.Path = ab;
  l.PerspectiveCamera = na;
  l.Plane = Sa;
  l.PlaneBufferGeometry = ic;
  l.PlaneGeometry = Td;
  l.PlaneHelper = Je;
  l.PointCloud = function(a, b) {
    console.warn("THREE.PointCloud has been renamed to THREE.Points.");
    return new Yc(a, b)
  };
  l.PointCloudMaterial = function(a) {
    console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.");
    return new Va(a)
  };
  l.PointLight = vf;
  l.PointLightHelper = ud;
  l.Points = Yc;
  l.PointsMaterial = Va;
  l.PolarGridHelper = Jf;
  l.PolyhedronBufferGeometry = Fa;
  l.PolyhedronGeometry = ge;
  l.PositionalAudio = bh;
  l.PositionalAudioHelper = yd;
  l.PropertyBinding = ja;
  l.PropertyMixer = dh;
  l.QuadraticBezierCurve = Za;
  l.QuadraticBezierCurve3 = mb;
  l.Quaternion = ya;
  l.QuaternionKeyframeTrack = Ae;
  l.QuaternionLinearInterpolant = nf;
  l.REVISION =
    "110";
  l.RGBADepthPacking = 3201;
  l.RGBAFormat = 1023;
  l.RGBA_ASTC_10x10_Format = 37819;
  l.RGBA_ASTC_10x5_Format = 37816;
  l.RGBA_ASTC_10x6_Format = 37817;
  l.RGBA_ASTC_10x8_Format = 37818;
  l.RGBA_ASTC_12x10_Format = 37820;
  l.RGBA_ASTC_12x12_Format = 37821;
  l.RGBA_ASTC_4x4_Format = 37808;
  l.RGBA_ASTC_5x4_Format = 37809;
  l.RGBA_ASTC_5x5_Format = 37810;
  l.RGBA_ASTC_6x5_Format = 37811;
  l.RGBA_ASTC_6x6_Format = 37812;
  l.RGBA_ASTC_8x5_Format = 37813;
  l.RGBA_ASTC_8x6_Format = 37814;
  l.RGBA_ASTC_8x8_Format = 37815;
  l.RGBA_PVRTC_2BPPV1_Format = 35843;
  l.RGBA_PVRTC_4BPPV1_Format =
    35842;
  l.RGBA_S3TC_DXT1_Format = 33777;
  l.RGBA_S3TC_DXT3_Format = 33778;
  l.RGBA_S3TC_DXT5_Format = 33779;
  l.RGBDEncoding = 3006;
  l.RGBEEncoding = 3002;
  l.RGBEFormat = 1023;
  l.RGBFormat = 1022;
  l.RGBM16Encoding = 3005;
  l.RGBM7Encoding = 3004;
  l.RGB_ETC1_Format = 36196;
  l.RGB_PVRTC_2BPPV1_Format = 35841;
  l.RGB_PVRTC_4BPPV1_Format = 35840;
  l.RGB_S3TC_DXT1_Format = 33776;
  l.RawShaderMaterial = md;
  l.Ray = ac;
  l.Raycaster = Ri;
  l.RectAreaLight = zf;
  l.RectAreaLightHelper = vd;
  l.RedFormat = 1028;
  l.ReinhardToneMapping = 2;
  l.RepeatWrapping = 1E3;
  l.ReplaceStencilOp =
    7681;
  l.ReverseSubtractEquation = 102;
  l.RingBufferGeometry = id;
  l.RingGeometry = ue;
  l.Scene = Kd;
  l.SceneUtils = {
    createMultiMaterialObject: function() {
      console.error("THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js")
    },
    detach: function() {
      console.error("THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js")
    },
    attach: function() {
      console.error("THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js")
    }
  };
  l.ShaderChunk = Q;
  l.ShaderLib = ib;
  l.ShaderMaterial = Aa;
  l.ShadowMaterial =
    sc;
  l.Shape = Pb;
  l.ShapeBufferGeometry = qc;
  l.ShapeGeometry = pc;
  l.ShapePath = Ug;
  l.ShapeUtils = xb;
  l.ShortType = 1011;
  l.Skeleton = ff;
  l.SkeletonHelper = td;
  l.SkinnedMesh = ce;
  l.SmoothShading = 2;
  l.Sphere = ub;
  l.SphereBufferGeometry = Ob;
  l.SphereGeometry = te;
  l.Spherical = Ti;
  l.SphericalHarmonics3 = Gf;
  l.SphericalReflectionMapping = 305;
  l.Spline = kh;
  l.SplineCurve = $a;
  l.SplineCurve3 = Xi;
  l.SpotLight = uf;
  l.SpotLightHelper = sd;
  l.SpotLightShadow = tf;
  l.Sprite = $d;
  l.SpriteMaterial = Nb;
  l.SrcAlphaFactor = 204;
  l.SrcAlphaSaturateFactor = 210;
  l.SrcColorFactor =
    202;
  l.StaticCopyUsage = 35046;
  l.StaticDrawUsage = 35044;
  l.StaticReadUsage = 35045;
  l.StereoCamera = Ni;
  l.StreamCopyUsage = 35042;
  l.StreamDrawUsage = 35040;
  l.StreamReadUsage = 35041;
  l.StringKeyframeTrack = of ;
  l.SubtractEquation = 101;
  l.SubtractiveBlending = 3;
  l.TOUCH = {
    ROTATE: 0,
    PAN: 1,
    DOLLY_PAN: 2,
    DOLLY_ROTATE: 3
  };
  l.TangentSpaceNormalMap = 0;
  l.TetrahedronBufferGeometry = bd;
  l.TetrahedronGeometry = he;
  l.TextBufferGeometry = hd;
  l.TextGeometry = se;
  l.Texture = S;
  l.TextureLoader = rf;
  l.TorusBufferGeometry = fd;
  l.TorusGeometry = ne;
  l.TorusKnotBufferGeometry =
    ed;
  l.TorusKnotGeometry = me;
  l.Triangle = va;
  l.TriangleFanDrawMode = 2;
  l.TriangleStripDrawMode = 1;
  l.TrianglesDrawMode = 0;
  l.TubeBufferGeometry = mc;
  l.TubeGeometry = le;
  l.UVMapping = 300;
  l.Uint16Attribute = function(a, b) {
    console.warn("THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.");
    return new bc(a, b)
  };
  l.Uint16BufferAttribute = bc;
  l.Uint32Attribute = function(a, b) {
    console.warn("THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.");
    return new cc(a,
      b)
  };
  l.Uint32BufferAttribute = cc;
  l.Uint8Attribute = function(a, b) {
    console.warn("THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.");
    return new Md(a, b)
  };
  l.Uint8BufferAttribute = Md;
  l.Uint8ClampedAttribute = function(a, b) {
    console.warn("THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.");
    return new Nd(a, b)
  };
  l.Uint8ClampedBufferAttribute = Nd;
  l.Uncharted2ToneMapping = 3;
  l.Uniform = Hf;
  l.UniformsLib = K;
  l.UniformsUtils = Kl;
  l.UnsignedByteType =
    1009;
  l.UnsignedInt248Type = 1020;
  l.UnsignedIntType = 1014;
  l.UnsignedShort4444Type = 1017;
  l.UnsignedShort5551Type = 1018;
  l.UnsignedShort565Type = 1019;
  l.UnsignedShortType = 1012;
  l.VSMShadowMap = 3;
  l.Vector2 = z;
  l.Vector3 = q;
  l.Vector4 = ca;
  l.VectorKeyframeTrack = od;
  l.Vertex = function(a, b, c) {
    console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead.");
    return new q(a, b, c)
  };
  l.VertexColors = 2;
  l.VertexNormalsHelper = Fe;
  l.VideoTexture = Lg;
  l.WebGLMultisampleRenderTarget = qg;
  l.WebGLRenderTarget = sa;
  l.WebGLRenderTargetCube =
    Ib;
  l.WebGLRenderer = Hg;
  l.WebGLUtils = wi;
  l.WireframeGeometry = $c;
  l.WireframeHelper = function(a, b) {
    console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.");
    return new Z(new $c(a.geometry), new T({
      color: void 0 !== b ? b : 16777215
    }))
  };
  l.WrapAroundEnding = 2402;
  l.XHRLoader = function(a) {
    console.warn("THREE.XHRLoader has been renamed to THREE.FileLoader.");
    return new Qa(a)
  };
  l.ZeroCurvatureEnding = 2400;
  l.ZeroFactor = 200;
  l.ZeroSlopeEnding = 2401;
  l.ZeroStencilOp = 0;
  l.global = am;
  l.sRGBEncoding =
    3001;
  Object.defineProperty(l, "__esModule", {
    value: !0
  })
});